如何将清单添加到.NET DLL?

12

我有一个C#类库项目,它使用在系统上注册的COM dll。现在我想将COM dll部署为并行程序集,这样我就不必注册它,也不会干扰其他可能使用不同版本dll的应用程序。

我已经在C#项目中添加了app.manifest(使用“添加新项”菜单),但我不确定下一步该做什么。在项目属性/应用程序/图标和清单中,清单下拉列表是禁用的。我不知道如何解决这个问题。我已经添加了一个清单文件,为什么它不在下拉列表中?

我有一个用于C++应用程序的COM dll清单,我认为它应该保持原样。现在我需要知道如何编辑C#项目的app.manifest。我将首先添加一个已知的好的dependency元素。但我需要一个关于如何设置这个的教程,我没有看到它被涵盖在任何地方。

我正在使用VS2008。


1
我看到可执行文件项目启用了清单框。类库项目从不使用清单吗? - P a u l
3个回答

12

你可以在 .NET dll 中嵌入清单。应用程序清单的内容并非全部适用于程序集,但其中一些是适用的。例如,用户帐户控制 (UAC) 条目对于组件清单没有意义,但对于 assemblyIdentity 是有意义的。

使用 MT.EXE 工具,你可以将清单嵌入到 dll 中:

嵌入:

mt.exe -manifest filename.dll.manifest -outputresource:filename.dll;#2

提取:

mt.exe -inputresource:filename.dll;#2 -out:filename.dll.extracted.manifest

这里有更多相关信息的链接:

另一个 DLL 嵌入示例: http://msdn.microsoft.com/en-us/library/ms235591(v=VS.100).aspx

SxS 教程:http://msdn.microsoft.com/en-us/library/ms973915.aspx


3

唯一阻止你给.NET dll添加清单的是Visual Studio IDE。你可以通过直接修改.csproj来绕过它——在适当的属性组中添加ApplicationManifest属性。将清单添加到exe项目中并查看.csproj以获取详细信息。

这比使用MT.exe要容易得多,后者会替换现有的清单(通常不是你想要的结果)。


2

在大多数应用程序中,清单通常应用于EXE /主机应用程序 - 因为这是理解所有依赖程序集及其功能如何相互融合的级别。

例如,对于通过trustinfo / security / requestedPrivileges / requestedExecutionLevel元素设置UAC标记的情况,一个依赖程序集可以合法地说“我认为我们都了解UAC”是没有意义的。


是的,我发现了。你知道操作系统中的清单缓存吗? - P a u l
抱歉,我对缓存不了解(OTTOMH猜测:难道不是在加载时从EXE资源中读取的吗?任何缓存都应该是透明的 - 如果这么简单,你也不会问了!) - Ruben Bartelink
2
这是不正确的。DLL文件可以包含和激活清单(manifest)。只需要使用激活上下文API手动完成即可。 - David Heffernan
1
@DavidHeffernan 我毫不怀疑你是对的,但我正在努力修改我的答案,使其更少出错。如果OP接受LowRider2112的答案,我会很高兴取消这个答案。 - Ruben Bartelink
3
在重新阅读之后,我发现我的回答与你的问题无关 - 尽管我的陈述现在是正确的,但它们并没有涉及到 DLL,并且暗示你的问题提得不正确。我相当确定基于这个理由应该删除我的回答。如果它确实解决了你的问题,我不介意你保留它作为已接受的答案,但如果没有,我希望它被取消接受。此外,如果你同意删除回答,我将立即执行。 - Ruben Bartelink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接