2008-09-29 20 views
11

我有一个c#程序集,我通过COM从Delphi(win32 native)应用程序调用。为什么regasm.exe用错误的GUID注册我的c#程序集?

这适用于所有我测试过它,除了一个机器。

的问题是,德尔福应用程序获取“类未注册”尝试创建COM对象时。

现在,当我在注册表下查找HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID时,其中列出的GUID与AssemblyInfo.cs中的程序集Guid不同。它应该是相同的 - 它在安装它的所有其他计算机上都是一样的。

我已经试过regasm /unregister delphitocsharp.dll,并删除注册表项。然后,如果我做regasm delphitocsharp.dll,注册表项返回,但GUID是与以前相同(即错误),并且德尔福仍然获得“类未注册”。

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

所有我能想到的是,一个老版本的DLL是以前注册,并且仍然存在该文件,该文件正在regasm混淆的一些遗迹。

如何解决或至少进一步诊断这个问题?

回答

12

AssemblyInfo中的GUID成为“Type-Library”GUID,通常不是您要查找的内容。我假设你正试图访问一个类,并且你需要为这个类定义一个Guid属性和ComVisible。例如:

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

如果你不这样做,那么类或a)将不能注册,或者b)如果你在组件级别定义的标记有ComVisible特性(真),将被分配一个GUID该.NET为你烘烤。

1

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

+0

它不能在GAC中,因为我的程序集没有签名。好的,但我会搜索文件的其他副本。 – Blorgbeard 2008-09-29 06:51:46

1

则很可能具有相同的(老版)DLL的一个副本某处您的系统上,对于同一个文件的副本搜索磁盘和注册新副本之前手动删除(备份)他们。

相关问题