配置基于.NET的组件以实现免注册激活

Ran*_*oet 5 c# c++ com interop

我一直在尝试使用免注册的基于.NET的COM DLL工作,但没有成功.

  • 在Visual Studio 2008中,我添加了一个新的C#类库.
  • 我启用了'make assembly COM-visible'和'register for COM interop'选项.
  • 我添加了一个带有一些函数的公共接口和类.
  • 我在我的C++客户端应用程序中添加了一个清单依赖项:#pragma comment(linker,"/ manifestdependency ...

但是,当我启动我的应用程序时,我得到'应用程序无法启动,因为应用程序配置不正确'.

我使用Microsoft的mt工具来提取C++客户端应用程序和C#COM DLL的清单文件,两者中的信息是相同的(C++清单文件中的dependentAssembly包含与assemblyIdentity中相同的名称和版本. COM清单文件).

我也尝试了http://msdn.microsoft.com/en-us/library/eew13bza.aspx上描述的方法,但结果相似.

类似地,我尝试在我的C++客户端应用程序的"框架和参考"中添加对COM项目的引用.该属性页面上的信息看起来很有前途(它显示了'复制本地','复制依赖关系'等选项以及'assemblyIdentity'等属性),但Visual Studio既不复制DLL也不自动向清单文件添加依赖项.

请注意,'注册变体'工作正常.

任何人对我做错了什么有任何想法?

更新:

  • 当我创建一个简单的C++ DLL并嵌入一个与我的.NET COM DLL(相同的assemblyIdentity)相同名称和版本的清单时,我的应用程序启动正常.所以问题在于我的.NET COM DLL的清单文件.
  • 我可以成功从DLL中提取清单mt -managedassemblyname:...,然后嵌入相同的清单mt -outputresource:...,但这也不会导致Windows成功解决依赖关系.

Ran*_*oet 6

我自己找到了免注册 .NET COM 互操作所需的步骤:-)

  • 跑步:mt -managedassemblyname:"myDll.dll" -out:"myDll.manifest"
  • 干净的清单(请参阅http://msdn.microsoft.com/en-us/library/eew13bza.aspx中的格式)。主要是我需要删除除 assemblyIdentity、clrClass 和 file 之外的所有标签(特别是删除运行时、mvid 和依赖项标签)。
  • 跑步mt -outputresource:"myDll.dll" -manifest "myDll.manifest"。基本上,这会将修改后的清单作为资源添加到 DLL 中。请注意,这显然不是同一个清单(位置)!如果我使用 ManagedAssemblyName 选项重新提取清单,我仍然会得到“旧”清单。如果我使用 inputresource 选项提取它,我会得到新的。

我发现这一切都归功于 Windows Vista。与我的 Windows XP 不同,它包含一个名为 sxstrace 的工具,该工具提供有关并行执行问题的相当详细的信息。