1

这真让我抓狂。我开发了一个 .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 文件并不是绝对必要的,但我希望事情保持一致(并且由于某种原因,测试过程不会产生与主干版本相同的结果)所以我该如何强制它要创建吗?

这是一个 VB.NET DLL 项目,因此它没有(或我找不到)此处第一个答案中提到的“生成清单”属性下拉列表。我该如何设置?或者有没有办法通过直接编辑项目文件来设置它?

参考:

4

2 回答 2

2

你犯了一个相当普遍的错误。无 reg 的 COM 清单可帮助应用程序找到 COM 服务器,而无需在注册表中查找 DLL。将 manifest 嵌入 DLL 就像解决鸡和蛋的问题,如果 Windows 无法首先找到 DLL,就不可能找到该 manifest。

清单需要是客户端应用程序的一部分。这很棘手,因为它是 VB6,它不支持在其可执行文件中嵌入清单。

您可以修改 mt.exe 工具,这是一个支持在可执行文件中嵌入清单的 SDK 实用程序。您必须在构建 VB6 二进制文件后手动运行它。这很不好玩,而且当你忘记时很可能会造成麻烦。它通常不是一个令人愉快的使用工具,文档很少、不完整且无用,是清单的一个长期问题。

回退是一个单独的 app.exe.manifest 文件,当 Windows 找不到嵌入在可执行文件中的清单时,它接下来会寻找什么。其中“app.exe”必须重命名为VB6程序的名称。EXE,而不是 DLL。现在,这也使您有机会避免注册 VB6 DLL,如果您真的想让您的程序免注册运行,这大概是您真正想要的。缺点是你调试你的VB6程序时它不会工作,错误的EXE。您还需要一个位于 VB6 安装目录中的 vb6.exe.manifest。

不用说,VB6 在这里很难取得成功。它只是不是为了帮助你做到这一点,他们在 1998 年没有时间机器。

于 2013-05-17T11:01:56.273 回答
2

我不得不承认我根本不懂 VB,但对于 C++ 和 C# Visual Studio 项目,我以前不得不在构建后的步骤中调用 mt.exe 以获得我想要的 DLL 清单. 也许这种解决方法也适用于您的情况?

于 2013-05-17T15:32:02.453 回答