Почему regasm.exe зарегистрировать мою сборку c# с неправильным идентификатором GUID?
у меня есть сборка c#, которую я вызываю через COM из приложения Delphi (win32 native).
это работает на всех машинах, на которых я тестировал его, кроме одного.
проблема в том, что приложение Delphi получает "класс не зарегистрирован" при попытке создать COM-объект.
Теперь, когда я смотрю в реестре под HKEY_CLASSES_ROOTDelphiToCSharpCLSID
, идентификатор GUID, указанный там, не совпадает с идентификатором Guid сборки в AssemblyInfo.цезий. Это надо же - это же на все остальные компьютеры, на которых он установлен.
Я пробовал regasm /unregister delphitocsharp.dll
, и это удаляет ключ реестра. Тогда, если я это сделаю regasm delphitocsharp.dll
, возвращается раздел реестра, но GUID такой же, как и раньше (т. е. неправильно), и Delphi по-прежнему получает "класс не зарегистрирован".
DelphiToCSharp.dll на рабочей машине идентична (проверена с md5) версии на нерабочей машине.
Все, о чем я могу думать, это то, что старая версия dll была зарегистрирована раньше, и все еще существует некоторый остаток этого файла, который делает regasm запутанным.
как я могу исправить или хотя бы диагностировать эту проблему?
3 ответов
GUID в AssemblyInfo становится GUID "библиотеки типов" и обычно не является тем, что вы ищете. Я собираюсь предположить, что вы пытаетесь получить доступ к классу, и вам нужно определить атрибут Guid и ComVisible для класса. Например:
[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]
public class MyCOMRegisteredClass
Если вы этого не сделаете, то класс либо a) не будет зарегистрирован, либо b) Если вы определили COMVisible(true) на уровне сборки, будет назначен guid, который .NET поднимает для вас.
может быть, у вас где-то есть старая версия сборки? Может быть в GAC? Regasm, вероятно, берет это и использует его.
скорее всего, у вас есть копия той же (старой версии) dll где-то в вашей системе, найдите на диске копии того же файла и удалите (резервное копирование) их вручную перед регистрацией новой копии.