将项目的 .NET 目标框架从 4.0 更改为 3.5 后找不到文件(或程序集)

Posted

技术标签:

【中文标题】将项目的 .NET 目标框架从 4.0 更改为 3.5 后找不到文件(或程序集)【英文标题】:File (or assembly) can't be found after changing project's .NET target-framework from 4.0 to 3.5 【发布时间】:2011-04-12 04:16:52 【问题描述】:

我想将基于 .NET 4.0 的 C# 项目更改为 3.5。 所以我把项目的target-framework改成了3.5。

重新打开并尝试编译项目后出现错误:

找不到文件或程序集“System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统找不到文件。 oder eine Abhängigkeit davon wurde nicht gefunden。 Das System kann die angegebene Datei nicht finden。

这发生在文件 Resource.resx 中,如下所示:

<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <data name="traktor_connected" type="System.Resources.ResXFileRef, System.Windows.Forms">
        <value>..\Resources\traktor_connected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
    </data>
    <data name="traktor_not_connected" type="System.Resources.ResXFileRef, System.Windows.Forms">
        <value>..\Resources\traktor-not-connected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
    </data>

【问题讨论】:

Merkwuerdig, dass die err msg 混合了德语和英语 auf jener Weise。哦,我明白了 - 这是从 E 翻译成 D 的相同味精。 【参考方案1】:

该引用指向 .Net 4 - 您需要删除所有 .net 4 引用,然后使用 .net 3.5 版本的程序集读取它们,然后它将起作用

保罗

【讨论】:

仅将它们更改为版本 3.5.0.0 似乎还不够。您的意思是在 project-explorer 中也重新添加引用吗? 是的,您需要删除引用然后读取它们 - 因为您更改的硬编码 4.0.0.0 现在并不代表 .dll 的实际版本【参考方案2】:

更改目标框架设置并不完美。例如,在 C# 项目中,您必须手动删除对 Microsoft.CSharp 的引用。是的,它不会自动更新 .resx 文件中的 System.Drawing 程序集引用。这是一个相当大的缺陷,当您增加 .NET 版本号(几乎每个人通常都会这样做)时,它可以正常工作,如果您尝试减少它,则会卡布姆。 .NET 仅向前兼容。

您必须在更改目标框架后删除资源并重新添加它们。非常痛苦,手动编辑 .resx 文件以最小化工作是可能的。右键单击 .resx 文件,打开方式并选择文本编辑器。将程序集名称的版本从 4.0.0.0 更改为 2.0.0.0。

但请注意,可能存在更复杂的资源,例如 ImageList,其数据以二进制形式嵌入到 .resx 中。您将在 .resx 文件中看到一团 base64 编码字节。这也嵌入了版本号,由 BinaryFormatter 完成。 VS 不为您执行此操作的可能原因。编写一个小程序,将 base64 字符串解码回 byte[],找到正确的 0x34 并将其更改为 0x32 并将其转换回 base64 只是黑客的乐趣,机器风格的人:) 最好只是将它们重新添加到避免几乎不可避免的错误。

【讨论】:

在 VS2012 Update 3 中仍然可以得到这个。我有一个 Windows 服务,我已经从 .NET 4.5 更改为 .NET 3.5,因为我需要访问 SharePoint 2010 API。【参考方案3】:

当我在 NET 4.5 中安装 COM 组件然后降级到 NET 4.0 时出现此错误。删除和添加引用没有区别。

我觉得这很有帮助。

* 解决方案或解决方法更改默认平台目标 CPU 以允许应用程序在 64 位计算机上运行。 *

http://forums.arcgis.com/threads/19335-COM-Exception-was-unhandled-and-Class-not-registered

我的 NET 4.0 目标环境是 32 位的,所以我在属性窗口中将目标 CPU 设置为 x86。现在它运行了。

【讨论】:

以上是关于将项目的 .NET 目标框架从 4.0 更改为 3.5 后找不到文件(或程序集)的主要内容,如果未能解决你的问题,请参考以下文章

目标框架为4.0时System.BadImageFormatException

为啥将我的目标框架从“.NET Framework 4 Client Profile”更改为“.NET Framework 4”会出现警告消息?

改变目标框架

.Net 4.0 C# 项目中是不是需要 app.config?

mvc4.5更改为mvc4.0方法总结

查看dll文件中的代码