如何在现有COM服务器的位置注册.NET程序集

本文关键字:位置 注册 NET 程序集 服务器 COM | 更新日期: 2023-09-27 18:20:27

我必须处理一个COM类,它或多或少是一个更大系统的黑盒组件。此类来自COM EXE,并使用已知的AppID和Typelib ID在系统中注册。

出于调试和日志记录的目的,我创建了一个mock类,它在C#中实现了相同的接口。问题是:我如何注册我的程序集,以便当调用应用程序试图实例化接口时,它会实例化我的类?

编辑更多信息:

我有以下内容:类型库的GUID,实现类的GUID,类的ProgID GUID。导入类型库后,我做了以下操作:

[ComVisible(true)]
[ProgId("The.ProgId.Of.The.Old.Class")]
[Guid("{the guid of the old class}")]
public class MockImplementation : ISomething 
{
    // ...
}

我试着这样注册我的课程:

regasm/codebase myassembly.exe

然而,什么也没发生。应用程序仍然实例化旧类。我做错了什么?

如何在现有COM服务器的位置注册.NET程序集

此类来自COM EXE

请记住,您确实而不是编写了进程外COM服务器的真正替代品。您的替代品是进程中服务器。DLL。它们的位置存储在不同的注册表项中,进程外使用LocalServer32项,进程内使用InProcServer32项。我看不到你的测试代码来判断将使用哪一个。但很明显,这是错误的:)

Regasm.exe也是一个可能的故障点。请记住,它有两个版本。c:''windows''microsoft.net''framework中的32位版本写入32位注册表项,framework64中的64位版本写入64位注册表项。两者都运行良好,.NET代码可以在任何一种模式下运行,但您的测试应用程序将只使用其中一种。根据配置,VS测试运行程序默认为32位模式afaik。

这里的基本故障排除工具是SysInternals的Process Monitor。很高兴看到现有COM服务器和替换服务器都使用了哪些注册表项。作为一个起点,观察现有的服务器正在注册自己,这样您就可以准确地哪些注册表项是重要的。通常通过使用/regserver命令行选项运行EXE来完成。写下您看到正在编写的CLSID、Interface和TypeLib键。

然后在运行Regasm.exe时再做一次,将您看到的内容与您写下的内容进行比较。请确保使用/codebase选项,这样您就不会依赖GAC。是否使用/tlb选项是一个判断。请先使用它来比较密钥。当然,您现在看到的是InProcServer32而不是LocalServer32,这是不可避免的。

然后再做一次,现在运行你的测试应用程序。将您看到的阅读内容与您的笔记进行比较。您可能需要敲击LocalServer32密钥以防止其被使用。或者更好的是,完全注销旧服务器,这样它就不会妨碍运行,通常使用/unrgserver选项来完成。您必须重新运行Regasm.exe才能将密钥放回。