我需要使用 C# 在 .Net Framework 中创建一个免注册的 COM 对象。
我遵循了MSDN 演练。我必须努力解决它,或者它对我来说不够清楚,或者它不正确,但这是一篇旧帖子,我在 Windows 10 上使用 Visual Studio 2015,所以可能有些地方发生了变化。
以下是我为使其工作而采取的步骤:
编译COM C# dll
SideBySide.dll
(Target Framework 2.0),当然我没有regasm注册过。我不使用教程中描述的方法,它似乎对我不起作用。我创建
SideBySide.Manifest
的mt.exe
,这里是命令:mt -outputresource:"<path SidebySide.dll>" -manifest "<SideBySide.manifest>"
我手动修改了生成的清单以删除所有无用的标签,并添加强制性标签。这是修改后的清单:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="SideBySide" version="1.0.0.0" type="win32" /> <clrClass clsid="{4B72FC46-C543-4101-80DB-7777848D1357}" progid="SideBySide.SideBySideClass" threadingModel="Both" name="SideBySide.SideBySideClass" runtimeVersion="v2.0.50727"> </clrClass> <file name="SideBySide.dll"> </file> </assembly>
我已经
SideBySide.dll
用这个命令添加了清单:mt -outputresource:"<Path SidebySide.dll>" -manifest "SideBySide.manifest"
我已经从
SideBySide.dll using
tlbexp` 导出了 TLB。我在 C++ 客户端的配置中设置了No。
Properties -> Manifest tool -> Embed Manifest
我已经编译
client.exe
,然后我对client.exe.manifest
文件应用了更改。这是修改后的清单:<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type = "win32" name = "client" version = "1.0.0.0" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="SideBySide" version="1.0.0.0" /> </dependentAssembly> </dependency> </assembly>
一切运行良好,似乎我可以从本机 C++ 应用程序使用 .Net Framework COM 接口。
但是,当我尝试SideBySide.dll
使用 .Net Framework 4.0 或更高版本进行编译时,会出现问题CreateInstance
:
ISideBySideClassPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(SideBySideClass));
发生此错误:
0x8013101b :此程序集由比当前加载的运行时更新的运行时构建,无法加载。
当然,我已经尝试执行上面列出的所有步骤,我还尝试在 DLL 的清单中指定运行时版本,但它没有用。
我也读过这篇文章。问题是一样的,但我认为该解决方案不适合我,因为我需要从本机客户端调用 C# COM 对象。
是否有一些解决方法可以应用,还是我需要另一种方法来解决我的问题?