COM 代码库位置 - 如何选择要使用的版本

COM Codebase Location - How to pick which version to use?

本文关键字:选择 版本 代码 位置 何选择 COM      更新时间:2023-10-16

我需要修改 C# DLL 中的代码并在 C++ 应用程序中使用它。我对C++一点也不精明,所以如果有什么不清楚的地方,请告诉我。

我已使用以下方法注册了 C# 程序集:

regasm file.dll /tlb:file.dll /codebase

但是,当我尝试在 c++ 应用程序中使用它时:

CLSID clsid;
CLSIDFromProgID(L"MyApp.MyClass", &clsid);

HRESULT hr = CoCreateInstance(clsid,NULL, CLSCTX_INPROC_SERVER ,IID_MyClass, reinterpret_cast<void**>(&myclass));

hr返回0x8013151a: access to this member is denied

我注意到在注册表中,我看到多个版本的 C# dll(Codebase指向不同的 dll 位置)。

我认为问题是因为它没有使用正确的 dll。(我可能完全错了)。

我的问题是,你怎么知道它试图加载哪个版本的dll?

提前谢谢。

这不太可能是DLL地狱问题。 可以使用调试器的"调试 + 窗口 + 模块"窗口进行仔细检查,它显示 DLL 的路径。 通过让 MSBuild 注册组件、"项目 + 属性"、"生成"选项卡、"注册 COM 互操作"选项,保持注册表干净。 VS 必须提升运行。

这是一个 MethodAccessException,始终是一个编码错误。 在看不到代码的情况下需要进行心理调试,但最简单的解释是 C# 类的默认构造函数不是公共的。