Почему regasm.exe регистрирует мою сборку c # с неправильным GUID? - PullRequest
11 голосов
/ 29 сентября 2008

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

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

Проблема в том, что приложение Delphi получает «Класс не зарегистрирован» при попытке создать COM-объект.

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

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 29 сентября 2008

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

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

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

1 голос
/ 29 сентября 2008

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

1 голос
/ 29 сентября 2008

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

...