Подтвердить что ты не робот

Почему regasm.exe регистрирует мою сборку С# с неправильным GUID?

У меня есть сборка С#, которую я вызываю через COM из приложения Delphi (win32 native).

Это работает на всех машинах, на которых я тестировал их, кроме одного.

Проблема заключается в том, что приложение Delphi получает "Class not registered" при попытке создать COM-объект.

Теперь, когда я смотрю в реестре под HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID, указанный там GUID не совпадает с сборкой Guid в AssemblyInfo.cs. Он должен быть одинаковым - он одинаковый на всех других компьютерах, где он был установлен.

Я пробовал regasm /unregister delphitocsharp.dll и удаляет раздел реестра. Тогда, если я сделаю regasm delphitocsharp.dll, ключ реестра вернется, но GUID будет таким же, как и раньше (т.е. Неправильным), а Delphi все еще получает "Класс не зарегистрирован".

DelphiToCSharp.dll на рабочей машине идентичен (проверен с помощью md5) версии на нерабочем компьютере.

Все, о чем я могу думать, это то, что ранее была зарегистрирована старая версия dll, и все еще существует некоторый остаток этого файла, который заставляет regasm запутаться.

Как я могу исправить или хотя бы дополнительно диагностировать эту проблему?

4b9b3361

Ответ 1

GUID в AssemblyInfo становится GUID "Type-Library" и обычно не является тем, что вы искали. Я предполагаю, что вы пытаетесь получить доступ к классу, и вам нужно определить атрибут Guid и ComVisible для класса. Например:

[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]    
public class MyCOMRegisteredClass

Если вы этого не сделаете, класс либо a) не будет зарегистрирован, либо b) если вы определили COMVisible (true) на уровне сборки, ему будет присвоен указатель, который .NET выпекает для вас.

Ответ 2

Может быть, у вас есть старая версия сборки где-нибудь? Может быть, в ПКК? Regasm, вероятно, подбирает это и использует его.

Ответ 3

Скорее всего, у вас есть копия той же (старой версии) dll где-то в вашей системе, поиск диска для копий того же файла и удаление (резервное копирование) их вручную, прежде чем регистрировать новую копию.