我必须处理一个COM类,它或多或少是一个较大系统的黑匣子组件。此类来自COM EXE,并且已在系统中使用已知的AppID和Typelib ID注册。
为了调试和记录日志,我创建了一个模拟类,该类在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
{
// ...
}
我尝试像这样注册我的课程:
重新加气/ codebase myassembly.exe
然而,什么也没发生。该应用程序仍实例化旧类。我究竟做错了什么?
此类来自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密钥以防止使用它。或者更好的是,完全取消注册旧服务器,以便它不会妨碍您,通常使用/ unregserver选项完成此操作。您必须重新运行Regasm.exe,然后再放回密钥。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句