在.NET Core 2.0中使用COM对象

3

所以,客户有一个用C编写的COM对象,可以验证2007年编写的加密会话cookie。这目前在旧版本的.NET中使用以下方法正常工作。

var validate = Activator.CreateInstance(Type.GetTypeFromProgID("Company.Validate"));

新的实现将完全使用C#。我已经将验证逻辑提取到一个.NETCore类库中,我们在ASP.Net Core项目中引用这个类库。

  1. 我尝试了32位和64位版本,以及IIS设置。

  2. 我反编译了COM对象并引用它,它可以在本地工作,但在开发服务器上无法运行,我收到以下错误:

    由于以下错误原因检索组件CLSID {EDC43BC6-5ECD-4501-AEB3-64A17180A13D}的COM类工厂失败:80040154类未注册(HRESULT:0x80040154(REGDB_E_CLASSNOTREG))。

  3. COM在本地和开发服务器上均已注册。

  4. Activator.CreateInstance在任何环境下都不起作用。

  5. 本地和开发服务器上注册的COM ID和ProgId是相同的。


问:我错过了什么,还是这不会起作用?有人遇到过类似的挑战并获得成功吗?我是否忽略了什么?


1
DEV 服务器上运行 OleView(x86 和 x64),并验证您可以创建对象。仅说它已注册是不够的,特别是当证据似乎相反时。 - user585968
TypeLib和Interface都在那里,但它没有列在应用程序ID下面,而在其他机器上是这样的。我该如何注册它? - Ryan
知道了,OleView 巨大的帮助。谢谢。 - Ryan
4个回答

2

您不能在.NET Core中使用COM。COM仅适用于Windows,而.NET Core中的所有内容都必须跨平台。但是,您可以在完整框架上运行ASP.NET Core应用程序,然后就可以使用COM库了。换句话说,运行完整框架并不会妨碍您仍然能够使用ASP.NET Core。您只能部署到Windows,因为完整框架/COM依赖性。从技术上讲,如果您计划部署到Mac或Linux之类的系统,则只需要使用.NET Core。否则,请坚持自己熟悉的内容。


.NET Core并不强制要求您跨平台。您当然可以使用它。您是正确的,那么它将无法在所有操作系统上运行,但如果您想在.NET Core中使用COM并且仅针对Windows,则可以肯定地这样做。有限制条件。我最近发布了一篇文章,介绍了如何在命令行、Windows窗体和ASP.NET Core中使用.NET Core中的COM:https://www.mobilize.net/blog/mauricios-blog-redux - orellabac

2

所需的注册表键从未被创建。我不得不手动添加大约15个键,用于类、接口和类型。我认为这是因为COM从未被封送或调用(因为那样不起作用),所以必须手动输入类ID、应用程序ID和注册表映射。


你有你所做的示例吗?我现在也遇到了同样的问题。谢谢。 - Sherwin Migriño
使用OleView创建必要的类ID和其他注册表项(这部分最为复杂)。接下来,将您尝试注册的DLL文件,如果您有源代码,请像通常一样将其引入到您的项目中,如果没有,则反编译源代码并在您的项目中生成一个“存根”类。 - Ryan

1
我最近遇到了这个问题,尝试实例化一个x86 coclass。结果发现Visual Studio启动了出现在系统路径中的第一个dotnet.exe,无论实际配置的架构是什么。在我的情况下,启动了一个x86_64变体的dotnet.exe作为主机,而这个主机不能创建任何x86 coclass实例。
尝试手动将项目加载到适当的dotnet.exe变体中,看看是否有帮助。
编辑:这个问题在https://github.com/dotnet/core/issues/901上有更详细的讨论。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接