![](/img/trans.png)
[英]Registration-Free COM Interop: Deactivating activation context in finalizer throws SEHException
[英]Configure .NET-Based Components for Registration-Free Activation
我一直在尝试使用免注册的基于.NET的COM DLL工作,但没有成功。
但是,当我启动我的应用程序时,我得到'应用程序无法启动,因为应用程序配置不正确'。
我使用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也不自动向清单文件添加依赖项。
请注意,'注册变体'工作正常。
任何人对我做错了什么有任何想法?
更新:
mt -managedassemblyname:...
然后嵌入用相同的清单mt -outputresource:...
,但是这也不会导致Windows能够成功解决的依赖。 我找到了自己无需注册的.NET COM互操作所需的步骤:-)
mt -managedassemblyname:"myDll.dll" -out:"myDll.manifest"
mt -outputresource:"myDll.dll" -manifest "myDll.manifest"
。 基本上,这会将修改后的清单添加为DLL的资源。 请注意,这显然不是相同的清单(位置)! 如果我使用managedassemblyname选项重新提取清单,我仍然会获得“旧”清单。 如果我用inputresource选项提取它,我会得到新的。 我发现这一切都归功于Windows Vista。 与我的Windows XP不同,它包含一个名为sxstrace的工具,它提供了有关并行执行问题的相当详细的信息。
当我这样做时,我开始使用一个非常简单的基本组件来对COM内容进行排序。 我还在初始开发中使用了一个脚本客户端。
我没有使用Visual Studio,而是使用.NET代码的文本编辑器。 我插入了程序集和接口的GUID,并标记了AutoDispatch的接口。
using System;
using Interop=System.Runtime.InteropServices;
namespace Whatever
{
[Interop.Guid("xxxxxxxx-9120-4283-b972-changethis05")]
[Interop.ComVisible(true)]
[Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)]
public partial class MyClass :
...
}
我确保我的类有一个默认(无参数)构造函数。
我从命令行手动运行regasm /codebase
,指定.NET程序集。
我手工编写了javascript来实例化对象。
当事情令人困惑时,我用OleView.exe检查了ProgId。
一旦你掌握了非常基本的东西,就逐渐增加复杂性,直到你得到可行的解决方案。
你也可以从另一个方向使用这种方法; 来自客户。 安装.NET时,System.Random等.NET程序集标记为COM interop,因此您可以使用它们来验证您的C ++方法是否正确。 实例化System.Random ProgId类似于C ++的“hello,World” - 到.NET-via-COM。 如果成功,那么你就知道C ++的基本方法是合理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.