在 .NET Core 2.0 中使用 COM 对象
Using COM Object in .NET Core 2.0
因此,客户端有一个从 2007 年开始用 C 语言编写的 COM 对象,用于验证加密的会话 cookie。这目前适用于旧版本的 .NET,使用以下内容。
var validate = Activator.CreateInstance(Type.GetTypeFromProgID("Company.Validate"));
新的实现将完全使用 C#。我已经将验证逻辑提取到 .NETCore class 库中,我们又在 ASP.Net Core 中引用了它项目。
我试过 32 位和 64 位版本,以及 IIS 设置。
我反编译了 COM 对象并引用了它,它在本地工作,但在开发服务器上不工作,我收到以下错误:
Retrieving the COM class factory for component with CLSID {EDC43BC6-5ECD-4501-AEB3-64A17180A13D} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
COM在本地和开发服务器上都注册了。
Activator.CreateInstance
在任何一个环境中都不工作。
本地和开发服务器注册的COM ID和ProgId相同
问:我错过了什么,或者这行不通吗?有没有人在类似的挑战中取得成功?我是不是忽略了什么?
您不能将 COM 与 .NET Core 一起使用。 COM 是 Windows-only 而 .NET Core 中的所有内容都必须是 cross-platform。您 可以 但是 运行 您的 ASP.NET 完整框架上的核心应用程序,然后您可以使用 COM 库。换句话说,运行安装完整框架并不妨碍您继续使用 ASP.NET Core。由于完整的 framework/COM 依赖性,您将只能部署到 Windows。从技术上讲,如果您打算部署到 Mac 或 Linux 之类的东西,您只 需要 使用 .NET Core。否则,就坚持你所知道的。
我最近 运行 对此感兴趣,试图实例化一个 x86 coclass。结果是 Visual Studio 启动了出现在系统路径中的第一个 dotnet.exe,无论实际配置的架构是什么。在我的例子中,dotnet.exe 的 x86_64 变体作为主机启动,这反过来又不能创建任何 x86 coclass 实例。
尝试将您的项目手动加载到 dotnet.exe 的适当变体中,看看是否有帮助。
中有更详细的讨论
从未创建所需的注册表项。我不得不为 Class、接口和类型手动添加大约 15 个键。我相信这是因为 COM 从未被编组或调用(因为那行不通)所以必须手动输入 Class ID、AppID 和注册表映射。
因为我还不能发表评论....
您可以使用 regsvr32 MyComLibrary.dll 为您添加所有必要的注册表项。
参见 https://helpdeskgeek.com/how-to/register-dll-file-in-windows/
因此,客户端有一个从 2007 年开始用 C 语言编写的 COM 对象,用于验证加密的会话 cookie。这目前适用于旧版本的 .NET,使用以下内容。
var validate = Activator.CreateInstance(Type.GetTypeFromProgID("Company.Validate"));
新的实现将完全使用 C#。我已经将验证逻辑提取到 .NETCore class 库中,我们又在 ASP.Net Core 中引用了它项目。
我试过 32 位和 64 位版本,以及 IIS 设置。
我反编译了 COM 对象并引用了它,它在本地工作,但在开发服务器上不工作,我收到以下错误:
Retrieving the COM class factory for component with CLSID {EDC43BC6-5ECD-4501-AEB3-64A17180A13D} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
COM在本地和开发服务器上都注册了。
Activator.CreateInstance
在任何一个环境中都不工作。本地和开发服务器注册的COM ID和ProgId相同
问:我错过了什么,或者这行不通吗?有没有人在类似的挑战中取得成功?我是不是忽略了什么?
您不能将 COM 与 .NET Core 一起使用。 COM 是 Windows-only 而 .NET Core 中的所有内容都必须是 cross-platform。您 可以 但是 运行 您的 ASP.NET 完整框架上的核心应用程序,然后您可以使用 COM 库。换句话说,运行安装完整框架并不妨碍您继续使用 ASP.NET Core。由于完整的 framework/COM 依赖性,您将只能部署到 Windows。从技术上讲,如果您打算部署到 Mac 或 Linux 之类的东西,您只 需要 使用 .NET Core。否则,就坚持你所知道的。
我最近 运行 对此感兴趣,试图实例化一个 x86 coclass。结果是 Visual Studio 启动了出现在系统路径中的第一个 dotnet.exe,无论实际配置的架构是什么。在我的例子中,dotnet.exe 的 x86_64 变体作为主机启动,这反过来又不能创建任何 x86 coclass 实例。
尝试将您的项目手动加载到 dotnet.exe 的适当变体中,看看是否有帮助。
中有更详细的讨论从未创建所需的注册表项。我不得不为 Class、接口和类型手动添加大约 15 个键。我相信这是因为 COM 从未被编组或调用(因为那行不通)所以必须手动输入 Class ID、AppID 和注册表映射。
因为我还不能发表评论.... 您可以使用 regsvr32 MyComLibrary.dll 为您添加所有必要的注册表项。 参见 https://helpdeskgeek.com/how-to/register-dll-file-in-windows/