将资源添加到现有程序集

时间:2011-02-28 16:02:35

标签: .net reflection

我有一个COM Interop DLL,我使用tlbimp从现有的COM DLL自动生成。我需要的是将详细信息添加到DLL的属性对话框中以获取文件版本,版权信息等。

我发现some sample code使用AssemblyBuilder.SetCustomAttribute() API来动态设置AssemblyCopyrightAttribute等。

但是,正在使用的AssemblyBuilder实例来自AppDomain.CurrentDomain.DefineDynamicAssembly(),它似乎只会创建程序集。 (实际上,每当我使用我的DLL名称尝试该代码时,它会删除我的DLL并创建一个新的。)

有没有办法为现有的程序集获取AssemblyBuilder的实例?

2 个答案:

答案 0 :(得分:2)

不,你从根本上寻找错误的解决方案。您在资源管理器的“详细信息”选项卡中看到的实际上是非托管资源。 C#编译器从程序集属性(/ win32res编译器选项)自动生成一个,当然这在创建互操作程序集时不会发生。或者就此而言,尝试使用AssemblyBuilder创建一个。

要使其工作,首先必须使用ildasm.exe / out反汇编互操作库。接下来,您必须创建一个版本资源,最好用C ++项目完成。使用资源编辑器添加版本资源。构建完成后,您将获得一个.res文件。然后使用ilasm.exe重新创建互操作库,使用/ resource选项获取嵌入的.res文件。

我给你的是每小时100英里的版本,这很难实现自动化。

答案 1 :(得分:0)

没有必要跳过汉斯提到的许多箍,只是为了向PE文件添加非托管资源。创建版本资源in-memory - 这不是很困难 - 并使用Win32 BeginUpdateResource& co。将此资源添加到tlbimp生成的.exe文件中。