.NET 4 中的混合模式程序集
Posted
技术标签:
【中文标题】.NET 4 中的混合模式程序集【英文标题】:Mixed mode assembly in .NET 4 【发布时间】:2011-03-11 21:04:11 【问题描述】:大约 2 年前,我在 .NET 2.0 中编写了一个用于数据库访问的类库,并且一直在 .NET 2.0、3.0 和 3.5 上使用它。
在我正在处理的当前项目(这是一个 .NET 4.0 应用程序)中,尝试使用旧的忠实类库,但出现以下异常:
System.InvalidOperationException 未处理 Message=创建表单时出错。有关详细信息,请参阅 Exception.InnerException。 错误是:混合模式程序集是针对运行时版本“v2.0.50727”构建的 并且在没有额外配置信息的情况下无法在 4.0 运行时加载。 来源=学校经理 堆栈跟踪: 在 SchoolManager.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 190 在 SchoolManager.My.MyProject.MyForms.get_frmGeneric() 在 D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\My Project\Application.Designer.vb:line 35 中的 SchoolManager.My.MyApplication.OnCreateMainForm() 在 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() 在 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() 在 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(字符串 [] 命令行) 在 SchoolManager.My.MyApplication.Main(String[] Args) 在 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔 ignoreSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart() 内部异常:System.IO.FileLoadException Message=混合模式程序集是针对版本“v2.0.50727”构建的 运行时,并且无法在 4.0 运行时中加载而无需额外的 配置信息。 来源=Dinofage.Data.XpressData 堆栈跟踪: 在 Dinofage.Data.XpressData.ExecuteSelectInternal(字符串选择命令) 在 Dinofage.Data.XpressData.ExecuteSelect(字符串选择命令) 在 D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\Modules\Academics.vb 中的 SchoolManager.Academics.GetNewAdmissionCode(String AcademicYear):第 89 行 在 D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\UserControls\StudentDetail.vb:line 20 中的 SchoolManager.StudentDetail..ctor() 在 D:\Alex\Documents\Visual Studio 2008\Projects\School Manager\SchoolManager\frmGeneric.Designer.vb:line 25 中的 SchoolManager.frmGeneric.InitializeComponent() 在 SchoolManager.frmGeneric..ctor() 内部异常:
可能出了什么问题,我该如何解决?
【问题讨论】:
我为 .NET 4.0 重新编译了类库,但仍然无法正常工作。难道是因为我在类库中引用了SQLite.NET 1.0.65.0? 重要提示:如果错误发生在错误列“文件”为SGEN
,则修复需要位于sgen.exe.config
旁边的文件sgen.exe
中。例如,对于 VS 2015,创建 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\sgen.exe.config
。来源:SGEN Mixed mode assembly 最小文件内容:<configuration><startup useLegacyV2RuntimeActivationPolicy="true"/></configuration>
【参考方案1】:
最好的方法可能是在 Visual Studio 2010 中为 .NET 4.0 重新编译您的类库(即打开项目、转换它并更改目标框架。)
如果您不能或不会这样做,那么您可以尝试将以下内容添加到您的 .NET 4.0 应用程序的 app.config 文件中:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
即。
<?xml version ="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
【讨论】:
在哪个位置可以找到 app.config?【参考方案2】:由于您的程序集是混合模式,它可能会从程序集中的非托管机器代码调用托管代码。借助 .NET 4.0 中新的进程内并行 CLR 版本支持,运行时不知道发生这种情况时需要提供哪个 CLR 版本。您必须使用 app.exe.config 文件来告诉它,该文件应如下所示:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
【讨论】:
我希望您正在观看,但是如果混合模式程序集正在由不受您控制的应用程序(例如 Excel.exe)加载怎么办。应该在哪里提供此配置信息? 在一个非常非常尴尬的地方,Excel.exe.config。任何人都可以弄乱它并杀死您的代码。是时候考虑在必要时重建组件了。 非常感谢您的确认。这确实是我前进的方向。【参考方案3】:另一种方法:在 VB 2010 Express 中,您可以打开项目并转到选项卡编译,然后转到 Advanced Compile Options...
。从名为Target framework (all configurations)
的下拉列表中选择.NET Framework 2.0
。
【讨论】:
但这也会阻止库使用任何 .Net 4.0 类库功能和 .net 4.0 目标程序集。【参考方案4】:如果即使指定 useLegacyV2RuntimeActivationPolicy="true" 也无法通过,您可能需要安装与您的操作系统和 .NET 版本兼容的设置。您可以在 http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 找到相同的内容。
在安装此设置之前,请从已安装的程序中卸载 SQLite。这将在您的代码中显示错误。
如果即使在安装兼容设置后仍无法正常工作,则必须删除对以前 DLL 文件的引用并添加对此兼容 DLL 文件的新引用。
当您添加对兼容 DLL 文件的引用时,您只需构建您的项目,您的所有代码错误都应该消失。
【讨论】:
【参考方案5】:您可以尝试在 Visual Studio 2010 中打开旧的忠实项目(类库)并让它为您进行转换。
【讨论】:
我将类库升级到 .NET 4,但仍然无法正常工作。我想是因为我在类库中引用了SQLite.NET。【参考方案6】:如果其他人仍然遇到此问题,这是我的诊断: 您使用了错误的 SQLite 包。 http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki下有多个SQLite版本
例如,如果您的目标是 .net 4.5 和 x86 platorm,您应该使用这个文件:
在 32 位 Windows (.NET Framework 4.5) 的预编译静态链接二进制文件下
sqlite-netFx45-static-binary-bundle-Win32-2012-1.0.106.0.zip
【讨论】:
【参考方案7】:就我而言,将以下内容添加到 App.config
解决了我的问题:
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
如下所示:
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<runtime>
<loadFromRemoteSources enabled="true" />
</runtime>
</configuration>
【讨论】:
以上是关于.NET 4 中的混合模式程序集的主要内容,如果未能解决你的问题,请参考以下文章