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

塔玛斯·塞莱伊(TamásSzelei)

我必须处理一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从服务器GAC删除.NET程序集DLL

将FTP服务器上现有的文件附加到C#.NET中的邮件

如何将现有的 nodejs 服务器应用程序连接到 Azure SQL 数据库

如何使用.Net核心“别名”程序集?

WinSCP .NET程序集:如何下载目录

使用WinSCP .NET程序集检查SFTP服务器上是否存在带有扩展名的文件

在PowerShell中使用WinSCP .NET程序集重命名SFTP服务器上的文件

在PowerShell中使用WinSCP .NET程序集监视FTP服务器上的上传文件

如何注册其他服务器上现有的 Clearcase 视图

如何通过现有的Python应用程序公开具有REST API和HTML / JavaScript应用程序的Web服务器?

如何使用.NET Reactor混淆包含多个附属程序集的.NET Core 3程序集?

如何将无服务器的Step Function /状态机/ Lambda构建嵌套到现有的AWS CloudFormation ElasticBeanstalk应用程序中?

如何在Somee.com Web服务器上配置Telerik的asp.net compnet

如何在Symfony2应用程序中使用现有的Web服务?

Linux上的PowerShell-如何加载\使用.Net程序集?

如何在Matlab中删除对.net程序集的引用

如何在Java中使用.Net程序集

如何在服务器上现有的图像阵列中添加图像?Xcode

ASP .NET CORE找不到具有自定义程序集的文件或程序集

C#-.net核心-具有比引用程序集更高版本的程序集

如何确保无法验证的.NET程序集有效?

将服务器端Blazor添加到现有的MVC Core应用程序

使用 Vue 增强现有的多页面/服务器渲染/经典 Web 应用程序

如何在远程服务器上构建.net应用程序?

如何在服务器上运行Java程序?

如何在.NET Core和.NET Framework应用程序之间共享程序集

如何在现有的Tomcat Web应用程序上实施SSO

如何在 VPS 服务器上运行 Django 的应用程序服务器

如何配置COM版本以使用RegAsm.exe注册的.NET程序集?