我在C#中有几个.NET应用程序,以及一个用于访问数据库的API.我想将所有版本的API放在数据库中,让他们选择最高版本和内部版本号,但要坚持使用它们构建的主要和次要编号.基本上,当我引用API时,1.2.3.4我希望引用读取,1.2.*.*以便应用程序只需要提取,1.2.3.5我看到我可以使用XML配置文件执行此操作.我宁愿让它遵守.类似于发布策略,但没有额外的文件.我可以满足于此.另一个问题是我看到的所有解决方案都将一个版本重定向到另一个特定版本,而不仅仅是更新版本.
我该怎么做呢?
有人能指出我对出版商政策的信息来源吗?
我试图通过使用XmlDocument类并直接修改值来在安装时更改bindingRedirect元素.这是我的app.config看起来像:
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
...
</sectionGroup>
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MyDll" publicKeyToken="31bfe856bd364e35"/>
<bindingRedirect oldVersion="0.7" newVersion="1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
...
</configuration>
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下代码将1.0更改为2.0
private void SetRuntimeBinding(string path, string value)
{
XmlDocument xml = new XmlDocument();
xml.Load(Path.Combine(path, "MyApp.exe.config"));
XmlNode root = xml.DocumentElement;
if (root == null)
{
return;
}
XmlNode node = root.SelectSingleNode("/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect/@newVersion");
if (node == null)
{
throw (new Exception("not found"));
}
node.Value = value;
xml.Save(Path.Combine(path, "MyApp.exe.config"));
}
Run Code Online (Sandbox Code Playgroud)
但是,它会引发"未找到"的异常.如果我将路径备份到/ configuration/runtime它就可以了.但是,一旦我添加了assemblyBinding,它就找不到该节点.可能这与xmlns有关吗?知道怎么修改这个吗?ConfigurationManager也无权访问此部分.
我需要加载同一DLL的两个版本,以便比较它们的输出.我假设我可以使用AppDomains,但我需要一些指导.
.NET世界中管理导致版本冲突的传递依赖项的最佳实践是什么?
详情:项目A取决于项目B,而项目B又取决于图书馆C.
也
项目A还依赖于项目X,它取决于库C的不同和(可能)不兼容的版本.
A-> B-> Cv1.0
&
A-> X-> Cv2.0
其中
Cv1.0 <> Cv2.0
有没有办法让这项工作?
可以在不使用GAC的情况下完成吗?
即使B和X只是二进制格式(源不可访问),它能否完成?
换句话说,有一种方法可以让Project B和X在项目A中一起使用时使用它们自己的依赖项而不会引起冲突.
注意:我意识到理想情况下我根本不应该有这个问题,但是由于对外部库的依赖扩展,这将是一个不可避免的副作用.所以我想知道它应该如何最好地处理它.
我有一个项目,我同时必须使用ActiveReports 2和ActiveReports 6中内置的报告.总的来说,它工作正常,但一些帮助程序集使用相同的名称.例如,为了能够导出为PDF,两个版本都使用名为ActiveReports.PdfExport.dll的程序集.当然,相应的组件是不同的.
请注意,我不直接访问ActiveReports.PdfExport.dll - 这是由ActiveReports运行时处理的.
我找不到将它们都包含在项目中的方法.有办法吗?GAC是答案吗?