11

我有 ac# 程序集,我通过 COM 从 Delphi(win32 本机)应用程序中调用它。

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

问题是 Delphi 应用程序在尝试创建 COM 对象时得到“类未注册”。

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

我试过regasm /unregister delphitocsharp.dll了,这会删除注册表项。然后,如果我这样做regasm delphitocsharp.dll,注册表项会返回,但 GUID 与以前相同(即错误),并且 Delphi 仍然得到“类未注册”。

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

我能想到的只是之前注册了旧版本的 dll,并且仍然存在该文件的一些残留物,这让 regasm 感到困惑。

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

4

3 回答 3

12

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

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

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

于 2008-09-29T07:13:04.097 回答
1

也许您在某处有旧版本的程序集?也许在 GAC 中?Regasm 可能正在接受并使用它。

于 2008-09-29T06:41:55.807 回答
1

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

于 2008-09-29T07:02:06.057 回答