繁体   English   中英

.NET Framework (v 4.0) COM 注册免费从 Win32 C++ 应用程序调用

[英].NET Framework (v 4.0) COM Registration free called from Win32 C++ application

我需要使用 C# 在 .Net Framework 中创建一个免注册的 COM 对象。

我遵循了MSDN 演练 我必须处理它,因为,或者它对我来说还不够清楚,或者它不正确,但是这是一篇旧帖子,我在 Windows 10 上使用 Visual Studio 2015,所以可能会发生一些变化。

以下是我为使其工作而采取的步骤:

  1. 编译COM C# dll SideBySide.dll (Target Framework 2.0),当然我没有用regasm注册过。

  2. 我不使用教程中描述的方法,它似乎对我不起作用。 我通过mt.exe创建SideBySide.Manifest ,这是命令:

    mt -outputresource:"<path SidebySide.dll>" -manifest "<SideBySide.manifest>"

  3. 我手动修改了生成的清单以删除所有无用的标签,并添加必需的标签。 这是修改后的清单:

     <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>
  4. 我已使用以下命令将清单添加到SideBySide.dll

    mt -outputresource:"<Path SidebySide.dll>" -manifest "SideBySide.manifest"

  5. 我已经SideBySide.dll using tlbexp` 从SideBySide.dll using导出了 TLB。

  6. 我在 C++ 客户端的配置Properties -> Manifest tool -> Embed Manifest中设置了

  7. 我已经编译了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 接口。

但是,当我尝试使用 .Net Framework 4.0 或更高版本编译SideBySide.dll时出现问题,当我调用CreateInstance

ISideBySideClassPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(SideBySideClass));

出现此错误:

0x8013101b:此程序集由比当前加载的运行时更新的运行时构建,无法加载。

当然,我已经尝试执行上面列出的所有步骤,我也尝试在 DLL 的清单中指定运行时版本,但没有用。

我也读了这篇文章 问题是一样的,但在我看来,解决方案不适合我,因为我需要从本机客户端调用 C# COM 对象。

是否有一些解决方法可以应用,或者我是否需要另一种方法来解决我的问题?

我很晚才意识到这一点,但是对于遇到此问题的其他任何人...

我今天早些时候遇到了这个问题。 我的注册免费 COM 库是用 .Net 4.5.2 构建的,我的解决方案是使用“runtimeVersion”属性如下

<clrClass 
   clsid="{...}" 
   progid="Library.Name" 
   threadingModel="Both" 
   name="Library.Name.Class"
   runtimeVersion="v4.0.30319">

或者,您可以省略 runtimeVersion 属性(或指定 v2.0.50272)并为 .Net 3.5 编译您的库。 这两种解决方案似乎都可以解决问题。

我只是猜测,但是您说清单文件中的运行时版本是 2.0.50727,但是您在用 4 编译时遇到问题? 您的清单和工具的版本不匹配。

我只是使用清单工具在我的程序集中创建和存储信息(在 PostBuild 步骤中):

"$(PathToYourTools)\mt.exe" -managedassemblyname:$(TargetPath) -nodependency -outputresource:$(TargetPath);#2

它的另一个好处是不需要为 .NET 程序集生成类型库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM