首页 文章

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

提问于
浏览
5

我一直在尝试使用免注册的基于.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的清单文件 .

  • 我可以使用 mt -managedassemblyname:... 从DLL中成功提取清单,然后使用 mt -outputresource:... 嵌入相同的清单,但这也不会导致Windows成功解析依赖关系 .

2 回答

  • -2

    我找到了自己无需注册的.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选项重新提取清单,我仍然会收到'old'清单 . 如果我用inputresource选项提取它,我会得到新的 .

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

  • 4

    当我这样做时,我开始使用一个非常简单的基本组件来对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-to-.NET-via-COM的“hello,World” . 如果成功,那么你就知道C中的基本方法是合理的 .

相关问题