将资源添加到现有程序集
我有一个 COM Interop DLL,它是使用 tlbimp 从现有 COM DLL 自动生成的。我需要的是将详细信息添加到 DLL 的“属性”对话框中以获取文件版本、版权信息等。
我发现 一些示例代码,使用 AssemblyBuilder.SetCustomAttribute()
API 动态设置 AssemblyCopyrightAttribute
等
。使用的 AssemblyBuilder
实例来自 AppDomain.CurrentDomain.DefineDynamicAssembly()
,它似乎只创建新程序集。 (事实上,每当我用我的 DLL 名称尝试该代码时,它都会删除我的 DLL 并创建一个新的。)
有没有办法获取现有程序集的 AssemblyBuilder
实例?
I have a COM Interop DLL that I'm automatically generating from an existing COM DLL, using tlbimp
. What I need is to add Details to the DLL's Properties dialog for file version, copyright info, etc.
I found some sample code that uses the AssemblyBuilder.SetCustomAttribute()
API to dynamically set AssemblyCopyrightAttribute
, etc.
However, the AssemblyBuilder
instance in use comes from AppDomain.CurrentDomain.DefineDynamicAssembly()
, which appears to only create new assemblies. (Indeed, whenever I try that code with my DLL name, it deletes my DLL and creates a new one.)
Is there any way to get an instance of AssemblyBuilder
for an existing assembly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不,您从根本上来说是在寻找错误的解决方案。您在资源管理器的“详细信息”选项卡中看到的实际上是非托管资源。 C# 编译器会根据程序集属性(/win32res 编译器选项)自动生成一个属性,当您创建互操作程序集时,这当然不会发生。或者就此而言,尝试使用 AssemblyBuilder 创建一个。
要实现此功能,您首先必须使用 ildasm.exe /out 反汇编互操作库。接下来,您必须创建版本资源,最好使用 C++ 项目来完成。使用资源编辑器添加版本资源。构建后您将获得一个 .res 文件。然后使用 ilasm.exe 重新创建互操作库,并使用 /resource 选项嵌入 .res 文件。
我给了你 100 英里每小时的版本,这很难自动化。
No, you're fundamentally looking for the wrong solution. What you see in explorer's Details tab is actually an unmanaged resource. The C# compiler auto-generates one from the assembly attributes (/win32res compiler option), this of course does not happen when you create an interop assembly. Or for that matter try to create one with an AssemblyBuilder.
To make this work, you first have to disassemble the interop library with ildasm.exe /out. Next, you have to create a version resource, best done with a C++ project. Use the resource editor to add a Version resource. After building you get a .res file. Then use ilasm.exe to re-create the interop library, using the /resource option to get the .res file embedded.
I gave you the 100 miles per hour version, this is hard to automate.
无需跳过 Hans 提到的许多步骤,只需将非托管资源添加到 PE 文件即可。创建一个版本资源内存中 - 这不是很困难 - 并使用Win32
BeginUpdateResource
&co。将此资源添加到tlbimp
生成的 .exe 文件中。There is no need to jump the many hoops Hans mentions just to add an unmanaged resource to a PE file. Create a version resource in-memory — it's not very difficult — and use Win32
BeginUpdateResource
&co. to add this resource to the .exe file produced bytlbimp
.