这让我发疯了。我开发了一个.NET COM DLL,VB6 DLL包装器使用它来更新和替换应用程序中的一些遗留函数。
我现在正试图删除在客户端计算机上使用regasm的要求,所以已经研究了如何在测试DLL上做到这一点,一切正常。
为了以防万一,我分支了DLL,并添加了一个app.manifest文件。其他一切都很好,我把它全部搞定了。清单是嵌入式的,Visual Studio 2012在发布文件夹中生成一个mydll.dll.manifest文件。
然后我回到原来的主干并添加了一个app.manifest文件(由于没有代码更改,没有合并点)。我将分支的内容复制到app.manifest文件中并构建了发布版本。清单嵌入在DLL中,但没有生成mydll.dll.manifest文件。
我知道拥有mydll.dll.manifest文件并不是绝对必要但我希望事情保持一致(并且出于某种原因,测试过程不会产生与trunk版本相同的结果)所以如何我可以强制它被创建吗?
这是一个VB.NET DLL项目,因此它没有(或我找不到)first answer here中提到的'Generate Manifest'属性下拉列表。我怎么设置这个?或者有没有办法通过直接编辑项目文件来设置它?
参考文献:
答案 0 :(得分:2)
你犯了一个相当常见的错误。免注册COM清单可帮助应用程序查找COM服务器,而无需查看注册表以找到DLL。将清单嵌入DLL中就像尝试解决鸡和蛋问题一样,如果无法首先找到DLL,Windows无法找到该清单。
清单需要成为客户端应用程序的一部分。这是棘手的,因为它是VB6,它不支持在其可执行文件中嵌入清单。
您可以修改mt.exe工具,这是一个支持在可执行文件中嵌入清单的SDK实用程序。在构建VB6二进制文件之后,您必须手动运行它。当你忘记时,那是不确定的并且很可能会造成麻烦。它通常不是一个快乐的工具,文档是微薄的,不完整的和无益的,一个长期的问题与清单。
回退是一个单独的app.exe.manifest文件,当找不到可执行文件中嵌入的清单时,Windows将查找下一个文件。必须将“app.exe”重命名为VB6程序的名称。 EXE,而不是DLL。这现在也让你有机会避免必须注册VB6 DLL,大概是你真正想要的,如果你真的想让你的程序运行无reg。缺点是,当您调试VB6程序时,它不起作用,错误的EXE。您还需要一个位于VB6安装目录中的vb6.exe.manifest。
毋庸置疑,也许很难在这里开始使用VB6。它只是没有帮助你做到这一点,他们在1998年没有时间机器。
答案 1 :(得分:2)
我必须承认我根本不懂VB,但在C ++和C#Visual Studio项目的情况下,我以前不得不求助于在后期构建步骤中调用mt.exe以获取DLL表明我想要的。也许这种解决方法也适用于您的情况?