如何在现有的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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

使用程序集链接器将资源文件链接到现有的.NET程序集

来自分类Dev

如何加快.NET程序集的加载性能

来自分类Dev

如何忽略NDepend中的.NET程序集?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何使用Grizzly嵌入式服务器在Jersey-Spring中配置现有的应用程序上下文?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使COM公开程序集与.NET引用程序集保持同步的最佳方法

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

.net核心等效于程序集上的GetCustomAttribute?

来自分类Dev

在 .net 程序集元数据上运行类似 SQL 的查询

来自分类Dev

参考基于.NET编译器开关的程序集

来自分类Dev

参考基于编译器开关的.NET程序集

来自分类Dev

在PHP中通过COM访问.NET程序集

来自分类Dev

通过PHP中的COM访问.NET程序集

来自分类Dev

使用来自delphi的com-invisible .net程序集

来自分类Dev

使用WinSCP .NET程序集从FTP服务器下载除特定文件夹之外的所有文件

来自分类Dev

在现有ESXI 6服务器上安装AC-7265无线驱动程序

来自分类Dev

如何读取.net程序集的元数据表

Related 相关文章

  1. 1

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

  2. 2

    使用程序集链接器将资源文件链接到现有的.NET程序集

  3. 3

    如何加快.NET程序集的加载性能

  4. 4

    如何忽略NDepend中的.NET程序集?

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

    如何使用Grizzly嵌入式服务器在Jersey-Spring中配置现有的应用程序上下文?

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

    使COM公开程序集与.NET引用程序集保持同步的最佳方法

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

    .net核心等效于程序集上的GetCustomAttribute?

  21. 21

    在 .net 程序集元数据上运行类似 SQL 的查询

  22. 22

    参考基于.NET编译器开关的程序集

  23. 23

    参考基于编译器开关的.NET程序集

  24. 24

    在PHP中通过COM访问.NET程序集

  25. 25

    通过PHP中的COM访问.NET程序集

  26. 26

    使用来自delphi的com-invisible .net程序集

  27. 27

    使用WinSCP .NET程序集从FTP服务器下载除特定文件夹之外的所有文件

  28. 28

    在现有ESXI 6服务器上安装AC-7265无线驱动程序

  29. 29

    如何读取.net程序集的元数据表

热门标签

归档