迁移到.net 4后,我们开始面对库的问题.假设我们有我们的库MyLib.dll,它引用了Interop程序集Interop.dll.Interop.dll引用了MissingInterop.dll.
所以引用可以显示为: MyLib.dll -> Interop.dll -> MissingInterop.dll
在MyLib.dll中,我们只使用Interop.dll中的部分类,因此我们永远不会调用任何需要MissingInterop.dll的内容,并且在.net 3.5中它运行正常这就是为什么我们不使用MyLib.dll发送MissingInterop.dll.
当我们在.net 4下运行的进程使用MyLib.dll时,应用程序失败,并出现以下异常:
FileNotFoundException:"无法加载文件或程序集'MissingInterop.dll,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.系统找不到指定的文件."
另外我注意到Interop.dll引用了其他缺少的dll但是.net不会尝试加载它们.我发现了差异.MissingInterop.dll中的某些类型用于Interop.dll中的方法参数,而来自其他缺失库的类型仅用作方法返回类型,即在Interop.dll中我可以看到:
Class C1
MethodA : void (valuetype [MissingInterop]MissingAssembly.TypeA&)
Class C2
get_Status : valuetype[AnotherMissingInterop]AnotherMissingAssembly.TypeB()
Run Code Online (Sandbox Code Playgroud)
和.NET 4尝试加载MissingInterop.dll但不尝试加载AnotherMissingInterop.dll.
.NET 3.5没有尝试加载MissingInterop.dll和AnotherMissingInterop,因为它们没有在执行路径中使用.
我知道.NET 4有新的Fusion,但我没有在任何地方找到这样的突破性变化.有谁知道为什么.NET 4会尝试加载不需要的东西?有没有办法解决这个问题,而无需重新编译代码或添加丢失的文件?
我有一个自定义.NET程序集与一些PowerShell cmdlet比我用于常见的域相关任务.我刚刚创建了一个新的cmdlet,它引用了第三方库,该库引用了Newtonsoft.Json 4.5.0.0.但是我的其他项目之一使用最新版本的json.net(6.0.0.0).所以在PowerShell Fusion的运行时抛出一个错误,说它无法加载newtonsoft.json 4.5.0.0.
我已经尝试创建一个powershell.exe.config并在其中放置一个程序集重定向:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json", Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.融合日志确实表明它正在查找这个新的配置文件中的powershell,但它似乎没有拿起重定向.
有点难以解决这里的解决方案.任何线索可能是什么问题?同样的重定向在我的一些商业服务中起作用,否则会出现同样的问题(他们也使用第三方库和json.net 6).
干杯
将Microsoft.Aspnet.Webapi.Webhost包安装到我的web api项目后,我最终得到以下异常:
无法加载文件或程序集'System.Web.Http,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
假设我们有一个由一个可执行文件和5个库组成的应用程序.通常所有这些都将包含在一个目录中,并且将从那里加载库.
是否有可能这样做,例如我可以在一个名为Lib的目录中拥有一些库,其余的名为Lib2?这样应用程序目录只包含可执行文件本身,其他程序集将包含在各种逻辑目录中.
我怎样才能做到这一点?我想知道如何加载程序集,以及如何使应用程序的构建将程序集放在正确的目录中.
我们使用VS2008 SP1在C#中编码.我们有一个运行Team System Server 2008的服务器,我们将其用于源代码控制,任务等.服务器也是Team Build的构建机器.这已经很好地工作了很长时间.直到目前.当我们尝试构建一个引用一个外部程序集的项目时,我们会收到这些错误消息(通过Team Build,以及物理登录和通过Visual Studio进行常规构建时):
C:\ WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets:警告MSB3246:已解决的文件包含错误的图像,没有元数据或无法访问.无法加载文件或程序集 'C:\ Program Files\Syncfusion\Essential Studio\7.1.0.21\Assemblies\3.5\Syncfusion.XlsIO.Base.dll'或其依赖项之一.该模块应该包含一个程序集清单.
C:\ Program Files\MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets(24,2):错误MSB4062:无法从程序集Microsoft加载"Microsoft.Reporting.RdlCompile"任务. ReportViewer.Common,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a.无法加载文件或程序集'Microsoft.ReportViewer.Common,Version = 9.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.该模块应该包含一个程序集清单.确认声明是否正确,以及程序集及其所有依赖项是否可用.
找不到引用的组件"Syncfusion.XlsIO.Base".
这些错误适用于一个有问题的程序集引用的项目.当我尝试构建整个解决方案时,由于这个问题,当然会有更多错误.还有另外两个项目与其他程序集引用具有相同的问题.我有一个VS无法解决的引用程序集列表:
Syncfusion程序集来自第三方组件包.另外两个与Microsoft ReportViewer组件有关.
引用已通过"添加引用"窗口添加到.NET选项卡中,因此我认为没有任何可疑之处.在程序集引用的属性窗口中,Culture,Description,Path,Runtime Version或Strong Name中没有值.版本说0.0.0.0,Resolved是False.我猜很明显,VS无法解析引用.我的问题是为什么??? 我在这个问题上摸不着头脑.这只发生在服务器上,解决方案在我的机器和我的同事机器上构建得很好.我们的机器上的装配参考属性很好.
我试图卸载的第三方组件(当然在服务器上),然后然后重新安装.没有帮助.我试图修复与VS2008安装.没有帮助.试图从源代码控制中检索早期版本(我知道之前已在服务器上构建),并且我收到了相同的错误消息.我检查了文件权限,一切似乎都是有序的.我的想法已经不多了......
我该如何解决这个问题?
更新16.02.2009:
我试图在我的电脑和服务器上比较 dll的ildasm输出(参见我写的评论),并且在一行中有一个小的区别,对我来说似乎是一个评论.我必须承认,我不明白为什么会有所不同,所以也许有人可以向我解释一下?
我也尝试在服务器上运行病毒扫描.没有帮助.试图 …
出于好奇,我创建了两个程序集,它们都有一个Class1具有完全相同名称空间(Library1)的class ().然后我创建另一个引用这两个程序集的客户端,并尝试创建一个实例Class1.
毫不奇怪,编译器给出了关于模糊引用的编译错误.有没有办法明确指定我想要使用的程序集中的类型以避免歧义?
注意:我很少知道,如果有的话,在实践中发生.这只是一个关于语言特征的好奇心的问题.
不久前我将一个项目从MVC 3转移到了MVC 4.
当我建立时,我得到了消息
1> No way to resolve conflict between "System.Web.Mvc, Version=3.0.0.0 ..." and , Version=2.0.0.0
1> Consider app.config remapping of assembly "System.Web.WebPages ..." from Version "1.0.0.0" to Version "2.0.0.0" to solve conflict and get rid of warning.
1> Consider app.config remapping of assembly "System.Web.WebPages.Razorfrom Version "1.0.0.0" [c:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.Razor.dll] to Version "2.0.0.0" [C:\Users\OEM\documents\visual studio 2012\Projects\DabTrial\packages\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\System.Web.WebPages.Razor.dll] to solve conflict and get rid of warning.
Run Code Online (Sandbox Code Playgroud)
等等.
当我查看引用时,它们都是更高版本,而web.config仅引用更高版本.当我通过公钥令牌(在Windows资源管理器中)搜索整个解决方案目录时,我找不到引用早期版本的XML类型文件.
显然,文件的路径是不同的,但我找不到编译器被定向到早期.dll文件的路径的位置.
该项目构建并运行良好,但我认为编译器建议这些更改是有原因的.谢谢你的帮助.
我有一个用ASP.Net编写的工作XML Web服务.现在我需要引用位于特定文件夹中的某些程序集,例如c:\NotMyCode
我不想将该文件夹中的数百万个dll复制/复制到我的bin文件夹中.
我试图保留CopyLocal=falseWeb服务中引用的程序集.最终导致程序集的FileNotFound异常.当我切换到CopyLocal=true,引用的DLL被复制到bin文件夹..它的工作原理.
所以我的问题是:如何引用不在我的bin文件夹或它下面的子文件夹中的程序集?我是否需要在某处更改某些安全策略文件?我想我不是第一个想做这样事情的人......所以我假设有人已经解决了这个问题.
(我已经尝试在IIS ASP.net配置面板中模拟管理员用户,但这也没有用.)
更新:无法将其安装在GAC中.举一个类比,这个Web服务给第三方应用程序提供了一个简化的视图,例如Starteam.我不能(不应该......不想......)将该文件夹中的所有二进制文件复制到bin文件夹或将其安装到GAC中
如何在.NET中解析程序集.我的意思是,如何解决具有完全限定名称的程序集.我对公钥/私钥令牌和强命名感到困惑.谢谢
编辑:我也读过关于延迟签名和类似的东西.人们真的使用它吗?(有没有人实际使用过延迟签名)谁生成了签署程序集的密钥.如果我问了太多问题,我很抱歉.但是,我对这件事感到困惑.
我有一个Visual Studio 2010解决方案,其中包含一个类库(ProjectA)和两个Sharepoint项目(ProjectB和ProjectC).依赖顺序是ProjectB引用,ProejctA和ProjectC引用ProjectA和ProjectB.
在一台特定的开发机器上,我在尝试构建ProjectC时遇到以下错误:
编译失败.无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.
在查看融合日志时,我注意到以下错误:
*装配活页夹日志条目(14/06/2012 @ 09:38:32)*
操作失败.
绑定结果:hr = 0x80070002.该系统找不到指定的文件.
装配管理器从:C:\ Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll加载
在可执行文件C:\ Program Files(x86)\ Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe下运行
---详细的错误日志如下.
===预绑定状态信息===日志:用户= DOMAIN \用户名
日志:DisplayName = ProjectB,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = aaaaaaaaaaaaaaa,processorArchitecture = MSIL(完全指定)
日志:Appbase = file:/// C:/ Program Files(x86)/ Microsoft Visual Studio 10.0/Common7/IDE /
日志:初始PrivatePath = NULL
日志:动态Base = NULL
日志:缓存基数= NULL
日志:AppName = devenv.exe
调用程序集:(未知).
日志:此绑定在默认加载上下文中启动.
日志:使用应用程序配置文件:C:\ Program Files(x86)\ Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config
日志:使用主机配置文件:
日志:使用C:\ Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config中的计算机配置文件.
日志:政策后参考:ProjectB,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = aaaaaaaaaaaaaaa,processorArchitecture = MSIL …