代码之家  ›  专栏  ›  技术社区  ›  Randy Voet

为免注册激活配置基于.NET的组件

  •  5
  • Randy Voet  · 技术社区  · 16 年前

    我一直试图让一个基于.NET的免费注册COM DLL工作,但没有成功。

    • 在Visual Studio 2008中,我添加了一个新的C类库。
    • 我启用了“使程序集COM可见”和“注册COM互操作”选项。
    • 我添加了一个带有一些函数的公共接口和类。
    • 我为我的C++客户端应用程序添加了一个清单依赖项:

    但当我启动应用程序时,我得到“应用程序由于应用程序配置不正确而未能启动”。

    我已经使用微软的MT工具来提取C++客户端应用程序和C*YCOM DLL的清单文件,并且两者的信息是相同的(C++清单文件中的依赖程序集包含与COM清单文件中的汇编身份相同的名称和版本)。

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

    类似地,我试图在我的C++客户机应用程序的框架和引用中添加我的COM项目的引用。该属性页上的信息看起来很有希望(它显示“复制本地”、“复制依赖项”等选项以及“assemblyIdentity”等属性),但Visual Studio既不复制DLL,也不自动向清单文件添加依赖项。

    请注意,“注册的变体”工作正常。

    有人知道我做错了什么吗?

    更新:

    • 当我创建一个简单的C++ DLL并嵌入一个与我的.NET COM DLL(相同的汇编身份)相同的名称和版本的清单时,我的应用程序启动得很好。所以问题在于.NET COM DLL的清单文件。
    • 我可以成功地从DLL中提取清单 mt -managedassemblyname:... 然后嵌入同一清单 mt -outputresource:... 但这也不会导致Windows成功解决依赖关系。
    2 回复  |  直到 16 年前
        1
  •  4
  •   Randy Voet    16 年前

    我发现了让免费注册.NET COM Interop自己工作所需的步骤:-)

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

    我发现这一切多亏了Windows Vista。与我的WindowsXP不同,它包含一个名为sxstrace的工具,它提供了关于并行执行问题的相当详细的信息。

        2
  •  -2
  •   Cheeso    16 年前

    当我这样做的时候,我开始使用一个非常简单的基本组件来排序COM内容。在最初的开发中,我也使用了脚本客户机。

    我没有使用Visual Studio,而是使用.NET代码的文本编辑器。我为程序集和接口插入了guid,并标记了用于自动显示的接口。

    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时,针对SoC互操作的.NET组件(如Stase.Read)被标记,因此您可以使用它们来验证C++中的方法是否正确。实例化一个系统。随机进程类似于C++to to .com的“hello,Word”。如果成功了,那么你知道C++中的基本方法是声音。