我在C#上相当新,所以如果我误解了某些东西,请耐心等待。
我的工作中有一个相当旧的应用程序,允许您导入dll来执行某些自动化任务。几年前所有的老程序员都离开了,我不支持联系这个应用程序。我使用.NET 2.0框架在visual studio 2013中创建了一个dll,并在尝试导入时收到此错误消息:
The format of the file 'MyDll.dll' is invalid. Type:System.BadImageFormatException
Source: mscorlib Stack Trace: at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Boolean isStringized, Evidence assemblySecurity, Boolean throwOnFileNotFound, Assembly locationHint, StackCrawlMark& stackMark)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Boolean stringized, Evidence assemblySecurity, StackCrawlMark& stackMark)
at System.Reflection.Assembly.LoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
at System.Reflection.Assembly.LoadFrom(String assemblyFile)
at Applications.frmApplications.loadFields()
at Applications.frmApplications.fillMenuItem()
at Applications.frmApplications.ugApplications_AfterSelectChange(Object sender, AfterSelectChangeEventArgs e)
at Infragistics.Win.UltraWinGrid.UltraGrid.OnAfterSelectChange(AfterSelectChangeEventArgs e)
at Infragistics.Win.UltraWinGrid.UltraGrid.FireEvent(GridEventIds id, EventArgs e)
at Infragistics.Win.UltraWinGrid.UltraGrid.SelectNewSelection(Type type, Selected selected)
at Infragistics.Win.UltraWinGrid.UltraGrid.InternalSelectItem(ISelectableItem item, Boolean clearExistingSelection, Boolean select)
at Infragistics.Win.UltraWinGrid.UltraGridRow.set_Selected(Boolean value)
at Applications.frmApplications.searchForApplication()
我在线查看了这个错误,基本的同意是我使用了错误的.NET框架版本。我已经使用.NET Reflector来查看正在使用的旧版dll的版本,它的版本为1.1.12.30886 。现在我的问题是是否存在另一种绕过此错误的方法,或者只能导入dll .NET 1.1版?如果是这样,有任何方法可以将我的dll改为1.1框架,因为我看到它的生命周期过去并且不再受支持,我也没有看到在Visual Studio中安装它的方法。
答案 0 :(得分:2)
如果您拥有应用程序的源代码,则可以重新编译它以获取最新的.NET框架。 .NET和C#团队非常努力地使版本兼容,因此您可能不会遇到任何错误。
坚持使用1.1(或2.0)框架可能是一个坏主意 - 与现代版本相比,它是非常严格的限制,正如您所指出的那样,它不受支持。如果你真的想要,你必须下载旧版本的Visual Studio / SharpDevelop / MonoDevelop /等等。 1.1仍处于每个.NET框架都有自己的Visual Studio版本的时候 - 你需要Visual Studio 2003.NET来使用1.1。
也就是说,我在不同.NET框架版本之间的互操作方面确实没有问题。但是,您需要确保安装了两个版本的框架 - 框架的较新版本不包含旧版本(因此2.0不包括1.1,而4.0不包括2.0或3.5)。有时您可以使用应用程序清单(程序集重新绑定)来修复此问题,但它可能会变得棘手。
BadImageFormatException
的另一个常见来源是比特。默认情况下,.NET现在使用AnyCPU,这意味着它将使用64位(如果可用),否则使用32位。例如,其中一个项目可能使用32位而另一个项目使用64位。