如何手动编辑Visual Studio项目的清单以显式指定引用的程序集?

时间:2012-08-23 13:50:30

标签: c# visual-studio-2010 compilation dependencies manifest

由于严重头疼的log4net强大的命名和版本控制,即旧的1.2.10名称,新的1.2.11名称和(天堂帮助我)1.2.10一个SAP制作并推入GAC它自己的强名,我的应用程序将拒绝在我自己的任何机器上运行。它一直在寻找强名称SAP版本的1.2.11版本,该版本不存在。

由于我的项目中没有任何内容被强烈命名,我想阻止编译器查找强名称程序集并只加载我放在目录中的那个。由于它抱怨清单不匹配,我试图在我的项目中找到该版本和公钥的引用,但我很简短。看来这个清单是在编译时创建的。

我该如何覆盖?是否有一个属性或开关或条件编译我可以用来准确指定我想引用哪个程序集?

最终我想使用1.24版本的log4net,并强制程序集忽略GAC中的版本,只查看本地bin目录。这真的不应该是这种痛苦。

2 个答案:

答案 0 :(得分:2)

运行时指令

在运行时,如果您不关心存在哪种特定版本,可以使用AppDomain.AssemblyResolve来解决程序集版本控制问题,您只想加载{{1}中的内容文件夹。此代码是使用inspiration from here创建的。

/bin

处理string[] ignoreAssembyVersions = new string[] { "log4net" }; AppDomain.CurrentDomain.AssemblyResolve += (_, assembly) => { //ignore the vesion number and return any version that has been loaded var name = new AssemblyName(assembly.Name); var shortName = name.Name; // retrieve short name if (ignoreAssembyVersions.Contains(shortName)) // compare against list of assemblies we ignore revisions for { // check if this assembly is already loaded under a different version # Assembly[] allAss = AppDomain.CurrentDomain.GetAssemblies(); List<Assembly> list = new List<Assembly>(allAss); var loadedAssembly = list.Find(ass => new AssemblyName(ass.FullName).Name == shortName); // check if we have any version loaded yet if (loadedAssembly != null) return loadedAssembly; else // assembly has not yet been loaded in this domain { // probe for assembly by name Assembly probedAssembly = Assembly.LoadFrom(string.Format("{0}.dll", shortName)); // probe for any match on assembly.dll return probedAssembly; } } return null; // ignore binding failure -> pass up the stack }; 事件的替代方法是use a custom bindingRedirect policy。但是 - 只有当您知道AssemblyResolve中当前存在的版本或App Domain中当前加载的版本时,此方法才有效。

构建时指令

如果您想要控制which assembly version is used at build-time,可以使用Specific Version='true'添加您添加的装配参考。

答案 1 :(得分:0)

我希望我理解你的问题。您可以考虑使用dependentAssembly配置来支持每个程序集的自定义绑定策略和程序集位置。 这是我的配置策略的快照,用于查找程序集的另一个版本System.Data.SQLite

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.81.0" newVersion="1.0.81.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>