繁体   English   中英

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

[英]How do I manually edit the manifest of my Visual Studio project to explicitly specify referenced assemblies?

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

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

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

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

运行时指令

在运行时,您可以使用AppDomain.AssemblyResolve来解决程序版本控制问题,当您不关心存在哪个特定版本时,您只想加载/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
};

处理AssemblyResolve事件的另一种方法是使用自定义bindingRedirect策略 但是 - 仅当您知道/bin存在的或当前在App Domain中加载的版本时,此方法才有效。

构建时指令

如果要控制在构建时使用哪个程序集版本,则可以对要添加的程序集引用使用Specific Version='true'

我希望我理解你的问题。 您可以考虑使用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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM