2011-03-28 39 views
6

我们使用tlbimp来生成互操作程序集。我们希望使用文件版本和组件版本来标记互操作程序集。但是,tlbimp上的/ asmversion选项似乎将这两个选项设置为相同的值。tlbimp如何用于指定不同的文件和装配版本?

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

+0

伟大的问题,但为什么你需要这种能力? – sharptooth 2011-03-28 06:57:46

+0

我们希望在版本之间保持程序集版本相同(因为新程序集仍与现有客户机兼容),但是我们希望我们的安装程序用较新的程序集(例如bugfix)替换程序集的旧版本(并且安装程序为此使用FileVersion)。 – dominic 2011-03-28 07:08:49

+0

我明白了,这很合理。 – sharptooth 2011-03-28 07:28:03

回答

5

最后,我们发现一对夫妇的介绍了一个在CodePlex上tlbimp2项目链接,并编译我们自己的修改tlbimp2的版本:

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

我把代码来自tlbimp项目2.并且沿着1行修改它。有几个问题我们必须解决:

在TlbImp.cs我必须明确地组装从FileVersionInfo.GetVersionInfo结果的文件版本号,因为文件版本属性是空的:

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

或自定义资源将不能使用。

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

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字节。