问题 为什么regasm.exe使用错误的GUID注册我的c#程序集?


我有一个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仍然获得“Class not registered”。

工作机器上的DelphiToCSharp.dll与非工作机器上的版本完全相同(通过md5验证)。

我能想到的只是之前注册了一个旧版本的dll,并且仍然存在一些使该文件混乱的文件的残余。

我该如何修复或至少进一步诊断此问题?


7080
2017-09-29 05:56


起源



答案:


AssemblyInfo中的GUID成为“类型库”GUID,通常不是您要查找的内容。我假设你正在尝试访问一个类,你需要为类定义一个Guid属性和ComVisible。例如:

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

如果你不这样做,那么a)将不会被注册,或者b)如果你在程序集级别定义了COMVisible(true),将会为你分配一个.NET为你加油的guid。


12
2017-09-29 07:13





也许你有一个旧版本的程序集?也许在GAC? Regasm可能正在挑选并使用它。


1
2017-09-29 06:41



它不能在GAC中,因为我的程序集没有签名。不错,我会搜索该文件的其他副本。 - Blorgbeard
.Net的程序集加载并没有像win32那样在多少目录中找到dll,所以很难这样。 - Lars Truijens


答案:


AssemblyInfo中的GUID成为“类型库”GUID,通常不是您要查找的内容。我假设你正在尝试访问一个类,你需要为类定义一个Guid属性和ComVisible。例如:

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

如果你不这样做,那么a)将不会被注册,或者b)如果你在程序集级别定义了COMVisible(true),将会为你分配一个.NET为你加油的guid。


12
2017-09-29 07:13





也许你有一个旧版本的程序集?也许在GAC? Regasm可能正在挑选并使用它。


1
2017-09-29 06:41



它不能在GAC中,因为我的程序集没有签名。不错,我会搜索该文件的其他副本。 - Blorgbeard
.Net的程序集加载并没有像win32那样在多少目录中找到dll,所以很难这样。 - Lars Truijens


很可能你的系统上有一个相同(旧版本)dll的副本,搜索磁盘以查找同一文件的副本,并在注册新副本之前手动删除(备份)它们。


1
2017-09-29 07:02