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

Posted

技术标签:

【中文标题】tlbimp 如何用于指定不同的文件和程序集版本?【英文标题】:How can tlbimp be used to specify different File and Assembly versions? 【发布时间】:2011-07-24 06:06:00 【问题描述】:

我们正在使用 tlbimp 来生成互操作程序集。我们想用文件版本和程序集版本标记互操作程序集。但是,tlbimp 上的 /asmversion 选项似乎将这两个设置为相同的值。

有谁知道如何使用 tlbimp 在互操作程序集上设置不同的文件和程序集版本?

【问题讨论】:

问得好,但你究竟为什么需要这种能力? 我们希望在不同版本之间保持程序集版本相同(因为新程序集仍然与现有客户端兼容),但我们希望我们的安装程序将旧版本的程序集替换为更新的 (例如错误修复)一个(安装程序为此使用 FileVersion)。 我明白了,这很合理。 那么为什么现在有赏金呢? 【参考方案1】:

最后,我们在 codeplex 上找到了几个关于名为 tlbimp2 的项目的链接,并编译了我们自己的修改版 tlbimp2:

    http://clrinterop.codeplex.com/discussions/208832 http://clrinterop.codeplex.com/SourceControl/changeset/view/39798

我从 2 的 tlbimp 项目中获取代码。并按照 1 的方式对其进行了修改。我们必须解决几个问题:

在 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);

到:

 AsmBldr.DefineVersionInfoResource();

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

希望这可以帮助遇到同样问题的其他人。

【讨论】:

【参考方案2】:

您似乎不太可能仅使用 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 字节组成。

【讨论】:

以上是关于tlbimp 如何用于指定不同的文件和程序集版本?的主要内容,如果未能解决你的问题,请参考以下文章

参考 Assemblies 文件夹和具有相同版本的不同程序集

程序集强签名和安装程序数字签名

Visual Studio 2010,TlbImp 在 2.0 项目中生成 .net 4.0 互操作

未能加载文件或程序集“SharpSvn.dll”或它的某一个依赖项。找不到指定的模块。

MSBuild:如何从 AssmeblyInfo.cs 中读取程序集版本和文件版本?

不同程序集版本的二进制反序列化