我正在编写一个验证工具,用于检查项目中引用的文件版本.我想使用MSBuild使用的相同解析过程.
例如,Assembly.Load(..)需要一个完全限定的程序集名称.但是,在项目文件中,我们可能只有"System.Xml"之类的东西.MSBuild可能使用项目的目标框架版本和其他一些启发式来决定加载哪个版本的System.Xml.
你将如何模仿(或直接使用)msbuild的装配解决过程?
换句话说,在运行时,我想获取字符串"System.Xml",以及.csproj文件中找到的其他信息,并找到msbuild将找到的相同文件.
我们有不同版本的非强名称程序集,并且在app.exe.config中没有绑定重定向/探测路径.例如,MyDll(1.0.0.0_null_neutral)和MyDll(2.0.0.0_null_neutral).相对于app.exe,这些程序集存储在LAC\MyDll_1.0.0.0_null_neutral和LAC\MyDll_2.0.0.0_null_neutral中.
我的理解是,因为MyDll程序集没有强名称,所以.NET运行时不区分不同版本的MyDll.因此,如果MyDll 1.0.0.0已经加载到内存中并且执行了针对MyDll 2.0.0.0构建的一些代码,则.NET运行时将不会加载MyDll 2.0.0.0.
但是,当我使用VS2008附加到进程并查看模块窗口时,我注意到MyDll 1.0.0.0和MyDll 2.0.0.0都是从LAC文件夹加载的.
在某处我的理解似乎存在差距.有人可以指出来吗?
编辑:感谢您的答复到目前为止.是的,我跳过那一点.可执行文件侦听AssemblyResolve事件,并通过查看LAC来处理它.
我很确定我之前看过一些MSDN文档,除非程序集具有强名称,否则会忽略所述版本.我会看看我是否可以把它挖出来.
目前我知道有两种方法将程序集嵌入到一个应用程序文件中:ILMerge并使用ResolveAssembly事件.
我想知道是否有人在一方面取得了更大的成功.
使用其中任何一个(性能,安全性......)有什么缺点吗?
从我的角度来看,看起来我们应该总是将所有"私有"程序集合并到一个应用程序中,因为当应用程序被视为一个整体时,它会更加干净.
有什么想法吗?
我正在开发一个单元测试项目(假设XXX.UnitTest)来测试我的解决方案中另一个项目(XXX)中的ViewModels.我可以添加引用但是当我构建时,错误表明它找不到相同的项目(XXX)
错误42无法加载文件或程序集"XXX,Version = 1.0.2.66,Culture = neutral,PublicKeyToken = null"或其依赖项之一.该系统找不到指定的文件.XXX.UnitTest
有谁知道还有什么可以导致这个问题?
当添加对VS 2008的引用时,该版本应该是v1.0.0.0,当它应该是v1.1.0.0时 - 据我所知,它绝对没有理由添加错误的版本.
这两个项目都是从头开始编写的,没有其他参考引用我正在尝试添加的程序集,当我在windows中查看该文件时,它具有正确的版本,但不知何故VS仍然选错了(目标路径是正确的) ).
有谁知道如何让VS选择我指向它的版本,而不是它决定的一些旧版本(完全没有理由)是正确的版本?
我之前问过这个问题,但没有解决问题的答案......
我绝对是在挑选正确的文件.
<bindingRedirect />在完整的.NET Framework之外是否受支持?例如,普通的.NET应用程序(在app.config或中web.config)支持以下内容:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="PostSharp" publicKeyToken="b13fd38b8f9c99d7" culture="neutral" />
<bindingRedirect oldVersion="3.0.0.0-3.1.1.1" newVersion="3.1.1.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
如果不支持,间接装配参考的问题如何解决?也就是说,如果组件A引用组件B和C,而B引用D v1.0,C到D v1.1,如果我们只运送D v1.1,我们如何确保B找到它的依赖关系?
有没有人知道为什么我们会得到MSB3247汇编版本错误(建议绑定重定向),当绑定重定向已经存在?
我们已经通过MSBuild详细错误和AsmSpy进行了常规检查以检查这一点.
来自MSBuild的诊断日志中的错误指示:
C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1635,5): warning MSB3247: Found conflicts between different versions of the same dependent assembly.
In Visual Studio, double-click this warning (or select it and press Enter) to fix the conflicts; otherwise, add the following binding redirects to the "runtime" node in the application configuration file:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="System.Web.Mvc" culture="neutral" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /></dependentAssembly></assemblyBinding> [Z:\PathTo\WebProject.csproj]
Run Code Online (Sandbox Code Playgroud)
在我们用于WebProject.csproj的web.config中,我们有:
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
在我们的开发机器和当前构建服务器上,我们不会收到错误.但是在我们正在建立的一些全新的构建机器上,我们正在看到它.我认为这可能与.NET 4.5.1或新分离的MS Build工具包有关?
我不能为我的生活弄清楚为什么它不开心 - 任何有关调试的提示(请记住我们只在带有构建工具的机器上!)
我在我的Word插件中使用Microsoft.Bcl.Async,我的插件编译为exe(test_addin.exe)文件,从Microsoft Word作为程序集加载,当我直接启动可执行文件时,一切正常,但是当我从Word运行它时,我收到一个错误,说它无法加载Systems.Threading.Tasks程序集.
Could not load file or assembly System.Threading.Tasks...
Run Code Online (Sandbox Code Playgroud)
看起来它与绑定重定向有关,当我尝试从Word运行应用程序时,它期望配置文件位于'C:\Program Files (x86)\Microsoft Office\Office15'文件夹中并被命名WINWORD.exe.config,遗憾的是这是不可能的,因为我可能无法访问该文件夹.
我的test_addin.exe.config文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.9.0" newVersion="2.6.9.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我试过设置AppDomain.CurrentDomain.SetupInformation.ConfigurationFile指向正确的路径,但它似乎没有帮助,是否有其他方法使其适用于Office加载项?
我有一个plugin P扩展和application A(.NET40),我无法控制。
P 程序集 (.NET40) 有一个shared dependency D(.NET35)。
P 和 D 都依赖于 FSharp.Core,但版本不同:
P编译针对FSharp.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
D编译针对FSharp.Core, Version=2.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
只部署了 FSharp.Core, Version=4.4.0.0 并且我订阅了 AppDomain.AssemblyResolve 来加载部署的程序集。
当我在 GAC 中安装了两个 FSharp.Core 版本的机器上进行测试时,它们最终都加载了插件。
我的理解是绑定重定向将是这里的解决方案,但如何在不访问 app.config 的情况下完成它?
.net plugins f# assembly-resolution assembly-binding-redirect
.net ×5
c# ×2
msbuild ×2
assemblies ×1
clr ×1
f# ×1
ilmerge ×1
merge ×1
plugins ×1
silverlight ×1
strongname ×1
unit-testing ×1