繁体   English   中英

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

[英]Configure .NET-Based Components for Registration-Free Activation

我一直在尝试使用免注册的基于.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能够成功解决的依赖。

我找到了自己无需注册的.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的工具,它提供了有关并行执行问题的相当详细的信息。

当我这样做时,我开始使用一个非常简单的基本组件来对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.

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