我一直在尝试使用免注册的基于.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 回答
我找到了自己无需注册的.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的工具,它提供了有关并行执行问题的相当详细的信息 .
当我这样做时,我开始使用一个非常简单的基本组件来对COM内容进行排序 . 我还在初始开发中使用了一个脚本客户端 .
我没有使用Visual Studio,而是使用.NET代码的文本编辑器 . 我插入了程序集和接口的GUID,并标记了AutoDispatch的接口 .
我确保我的类有一个默认(无参数)构造函数 .
我从命令行手动运行
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中的基本方法是合理的 .