我有一个c#程序集,我正在通过COM从Delphi(win32本机)应用程序调用。
这适用于我测试过的所有机器,除了一个。
问题是Delphi应用程序在尝试创建COM对象时获得“Class not registered”。
现在,当我查看HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID
下的注册表时,其中列出的GUID与AssemblyInfo.cs中的程序集Guid不同。它应该是相同的 - 它在安装它的所有其他计算机上都是相同的。
我尝试了regasm /unregister delphitocsharp.dll
,删除了注册表项。然后,如果我执行regasm delphitocsharp.dll
,则注册表项将返回,但GUID与之前相同(即错误),并且Delphi仍然会“未注册类”。
工作机器上的DelphiToCSharp.dll与非工作机器上的版本相同(通过md5验证)。
所有我能想到的是之前已经注册了旧版本的dll,并且仍然存在该文件的一些残余,这使得这一点变得混乱。
如何修复或至少进一步诊断此问题?
答案 0 :(得分:12)
AssemblyInfo中的GUID成为“类型库”GUID,通常不是您要查找的内容。我假设你正在尝试访问一个类,你需要为类定义一个Guid属性和ComVisible。例如:
[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]
public class MyCOMRegisteredClass
如果你不这样做,那么a)将不会被注册,或者b)如果你在程序集级别定义了COMVisible(true),那么将为你分配一个.NET为你加油的指针
答案 1 :(得分:1)
也许你有一个旧版本的程序集?也许在GAC? Regasm可能正在挑选并使用它。
答案 2 :(得分:1)
很可能你的系统上有一个相同(旧版本)dll的副本,搜索磁盘以查找同一文件的副本,并在注册新副本之前手动删除(备份)它们。