如何使用tlbimp指定不同的文件和程序集版本?

9
我们正在使用tlbimp生成互操作程序集。我们希望在这些互操作程序集上加上文件版本和程序集版本。但是,tlbimp的/asmversion选项似乎将这两个版本号都设置为相同的值。
有没有人知道如何使用tlbimp设置不同的文件版本和程序集版本呢?

很好的问题,但是你为什么需要这种能力呢? - sharptooth
1
我们希望在发布版本之间保持程序集版本号不变(因为新程序集仍然与现有客户端兼容),但是我们希望安装程序能够用更新的文件版本号替换旧版本的程序集(例如修复了的 bug 版本),以便安装程序能够正确识别。 - dominic
我明白了,这很合理。 - sharptooth
那么为什么现在要设置赏金? - Simon Mourier
2个回答

7
最终我们在codeplex上发现了一个名为tlbimp2的项目,编译了我们自己修改过的版本:
  1. http://clrinterop.codeplex.com/discussions/208832
  2. http://clrinterop.codeplex.com/SourceControl/changeset/view/39798
我参考了第1个链接中的方法对2号项目中的代码进行了修改。我们遇到了一些问题需要解决:
在TlbImp.cs文件中,我必须显式地从FileVersionInfo.GetVersionInfo的结果中组装文件版本号,因为FileVersion属性为空:
    if (Options.m_strFileVersion == null)
    {
        // get the fileversion
        var versionInfo = 
            FileVersionInfo.GetVersionInfo(Options.m_strTypeLibName);
        Options.m_strFileVersion = 
            versionInfo.FileMajorPart 
            + "." + versionInfo.FileMinorPart 
            + "." + versionInfo.FileBuildPart 
            + "." + versionInfo.FilePrivatePart;
    }

在 tlbimpcode.cs 文件中,我不得不切换:
 AsmBldr.DefineVersionInfoResource(
   strProduct, 
   strProductVersion, 
   strCompany, 
   strCopyright, 
   strTrademark);

to:

 AsmBldr.DefineVersionInfoResource();

否则自定义资源将不会被使用。

希望这能帮助遇到相同问题的其他人。


1

仅使用tlbimp似乎很难做到这一点。您可能需要处理IL。您需要添加类似以下内容的内容:

  .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 0B 33 2E 35 2E 35 30 32 31 31 2E 31 00 00 ) // ...3.5.50211.1.. 

格式为01 NN NN SS1 ... SSN 00 00

NN NN是字符串的长度,SS包含表示版本的ASCII字节。


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