我有另一个"无法加载文件或程序集或其中一个依赖项"的问题.
附加信息:无法加载文件或程序集"Microsoft.Practices.Unity,Version = 1.2.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
我不知道是什么导致这个或我如何调试它来找到原因.
我已经在我的解决方案目录.csproj文件中进行了搜索,以及我拥有Unity的所有地方:
参考Include ="Microsoft.Practices.Unity,Version = 2.0.414.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL"
在我的任何项目中找不到任何与1.2.0.0相对应的参考.
任何想法我应该如何解决这个问题?
我也很欣赏如何调试这样的问题的技巧.
我想确定本机程序集是否从托管代码应用程序(C#)编译为x64或x86 .
我认为它必须在PE头中的某处,因为OS加载器需要知道这些信息,但我找不到它.当然我更喜欢在托管代码中执行它,但如果有必要,我可以使用本机C++.
可能重复:
Visual Studio"任何CPU"目标
我注意到在VS中编译C#代码时,通常有编译32/64位系统的选项,还有一个用于编译任何cpu的选项.
这两个选项有什么区别?选择任何CPU只能编译为中间字节代码,而第一个选项编译为机器代码(这听起来不太可能)?或者是其他东西?
我已经将Windows服务构建为"任何CPU".但是,当我在64位机器上运行时,它以32位运行.我该如何解决?我使用的是.NET和C#,我的操作系统是Windows 2008 R2.
如果我在x64中构建它,它会以64位模式正确加载.但是,"Any Cpu" - 这就是我想要的 - 加载32位,即使它运行的机器完全支持64位.
编辑以根据反馈添加更多信息
我们确实有第三方工具以及引用c ++托管程序集.这些可能是也可能不是为任何CPU构建的.事实上我知道c ++托管程序集只是为x86构建的.然而,奇怪的是,如果我专门指定x64,该进程将启动并在x64中工作.如果框架试图加载c ++托管程序集,它将失败.我不介意这一点,因为在代码中,如果我们以64位模式运行,我们不会加载32位托管++程序集.可能是因为构建数据,因为这里有32位程序集,它应该将启动过程(在本例中是一个Windows服务程序集)标记为x86?
我试图在项目中使用Scintilla .NET(我想要一个好的编辑器+语法高亮等).不幸的是,当我在项目中引用二进制文件时,我似乎无法实际使用Scintilla控件.我得到两个不同的错误.
第一个发生在添加SciLexer.dll作为我的项目的引用时.我收到一条消息: 无法添加对SciLexer.dll的引用.请确保该文件是可访问的,并且它是有效的程序集或COM组件.
当我尝试使用ScintillaNET.dll中的控件时,会发生第二个错误.如果我尝试将组件拖到表单中,我会收到以下消息:无法创建组件Scintilla.错误消息如下:System.ComponentModel.Win32Exception:%1不是ScintillaNet.Scintilla.get_CreateParams()中的有效Win32应用程序
任何这些问题的帮助将不胜感激.为了记录,我正在运行在64位Windows 7平台上运行的Visual Studio 2008.
谢谢.
我似乎遇到了一个场景,当我在引用x64程序集的AnyCPU程序集上运行mstest时,我得到一个BadImageFormatException.
当AnyCPUTestingx64Production.dll测试程序集实现x64Production.dll中的接口(即使未使用)时,会出现此问题:
Unable to load the test container 'D:\AnyCPUTestingx64Production.dll'
or one of its dependencies. error details:
System.BadImageFormatException:
Could not load file or assembly 'x64Production, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Run Code Online (Sandbox Code Playgroud)
*** Assembly Binder Log Entry (09/02/2012 @ 09:44:26) …Run Code Online (Sandbox Code Playgroud) 我希望我的应用程序是为x64构建的(因为我使用的是x64 dll).在配置管理器中,我将"Active solution platform"设置为"x64"但是在项目列表Platform中设置为"x86".项目属性中的"平台目标"也设置为"x86"
我完全糊涂了设置目标平台的三个地方:
例如,我可以将Active解决方案平台设置为x64,将Project平台设置为x86,将Project target设置为x64.那意味着什么?
有人可以描述这些选项究竟是什么意思以及它们应该如何一起使用?如何编译到x64?
我在VS 2010中注意到C#项目的默认平台目标是x86(它曾经是任何CPU),并且想知道为什么要进行更改.
编译器是否基于将平台修复为x86 vs x64 vs任何CPU来执行任何优化?
出于性能原因,我应该将我的应用程序强制转移到一个平台还是另一个平台?
这个问题与之前关于SO的问题有关
我有一个应用程序,最初是使用Visual Studio 2005在Win XP上构建的(不要笑!).这个应用程序调用我们的win32 C++ DLL.调用C++ dll的C#组件是使用"Any CPU"配置构建的,并且很乐意在Win XP上运行,没有任何问题.
我们现在转向Win 7,我们的应用程序的发布版本(使用VC 2005构建在Win XP上)运行良好.然而,随着win 7向我们的用户推出,我们现在已经采取了机会转移到VS 2010并且我已经使用VC 2010在win 7上构建了C#组件,但是现在运行这个版本时我得到很多"无法加载abc. dll"其中abc.dll是我们的win32 c ++组件.
我知道用x86配置重新编译C#程序集将解决问题,但我不明白的是,使用Win-XP/Visual studio 2005(任何CPU配置)构建的发行版c#程序集如何能够在Win 7上运行任何问题?当然,这些使用"任何CPU"构建的C#程序集在Win 7中加载时应该JIT到64位代码并导致BadImageFormatException或其他错误,因为它们调用Win32 C++ dll.
更新:我在下面的评论中提供了更多信息.
在我的Windows 7机器上,我右键单击我的计算机并查看属性.系统信息显示"系统类型:64位操作系统",确认这是一个Win64操作系统.
在Windows XP上打开VC2005中的解决方案在查看解决方案的配置管理器时,我可以确认所有 C#项目都是平台类型"任何CPU".
在64位Win 7机器上运行发布版本(在VC2005/win xp上完成)时,我的任务管理器将图像名称显示为"Test.exe*32",这确认它是jit'd并加载到32位进程中.
我有一个带有几个项目的VS2013解决方案(C#WPF应用程序和类库).每个项目的"平台目标"都设置为"任何CPU".我的印象是,最终的EXE将在64位PC上运行为64位应用程序,在32位PC上运行32位应用程序.它是否正确?我的开发PC是64位,但是当我运行应用程序(独立或通过VS调试)时,它在任务管理器中显示为"foo.exe*32".这里发生了什么?
我们有一个拥有32位机器的初级开发人员.他还能打开解决方案并在VS中运行吗?
此外,某些项目引用了第三方DLL.供应商提供32位和64位版本 - 项目应引用哪一个?如果我引用32位DLL将阻止应用程序作为64位应用程序运行?如果我引用64位版本,这会给32位开发人员带来问题吗?那么最终用户呢 - 我的安装程序是否需要检查操作系统版本并复制相应的DLL?
最后,通过NuGet引用的DLL怎么样?NuGet是否安装了32位或64位版本的DLL?如何处理32位或64位最终用户安装?