什么是混合模式组件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是混合模式组件?相关的知识,希望对你有一定的参考价值。
我正在查看System.Data.SQLite下载page,它列出了.NET 4的混合模式程序集和常规(我假设)。我将要使用这个库的项目是.NET 4,它将被编译为x86。
我有两个问题:
- 什么是混合模式组件?谷歌回复了一系列令人困惑的答案,但这些答案都没有多大意义。一个答案表明,所有这些都是关于混合原生代码和托管代码,而其他人则认为它混合了.Net版本。
- 我应该从哪个下载中找到我的情况?
http://msdn.microsoft.com/en-us/library/x0w2664k.aspx
1)首先检查msdn。混合模式意味着程序集可以运行托管代码和非托管代码。
2)32位Windows(.NET Framework 4.0)的设置
http://system.data.sqlite.org/sqlite-netFx40-setup-bundle-x86-2010-1.0.74.0.exe
你自己回答了这个问题“我将使用这个库的项目都是.NET 4,它将被编译为x86。”
有一种方法可以从纯IL生成混合模式组件。使用反射创建装配的最后一部分涉及对AssemblyBuilder.Save的调用。如果只是为PortableExecutableKind参数传递PortableExecutableKinds.Required32Bit,那么您将创建一个混合模式程序集。您还可以通过传递PortableExecutableKinds.ILOnly来避免此问题。即
assembly_bldr.Save(exe_name, PortableExecutableKinds.Required32Bit | PortableExecutableKinds.ILOnly, ImageFileMachine.I386 );
毋庸置疑,这些信息很难获得......
取自官方FAQ
(14)什么是混合模式组件?
混合模式程序集是一个动态链接库,它包含特定处理器体系结构的托管代码和本机代码。由于它包含本机代码,因此只能将其加载到与其编译的处理器体系结构相匹配的进程中。另请参阅此StackOverflow问题。
它甚至引用了这个问题!
对于SQLite,该包包含System.Data.SQLite
的混合模式程序集;但是,默认包包含两个独立的程序集,一个是完全本机的,另一个是完全管理的互操作程序集。
在SQLite网站上实际上有一个FAQ。
(15) What is a "bundle" package (i.e. from the download page)?
下载页面上列出的“bundle”包在名为“System.Data.SQLite.dll”的文件中包含System.Data.SQLite混合模式程序集(请参阅问题#14),而不是单独的“System.Data.SQLite”。 dll“和”SQLite.Interop.dll“文件分别包含托管代码和本机代码。
以前的FAQ:
(14) What is a mixed-mode assembly?
混合模式程序集是一个动态链接库,它包含特定处理器体系结构的托管代码和本机代码。由于它包含本机代码,因此只能将其加载到与其编译的处理器体系结构相匹配的进程中。另见StackOverflow question。
为什么有两种选择?
Based on my research,非捆绑表单可用,这样您就可以在托管代码(例如C#)中使用P/Invoke
来调用非托管代码,而不是使用IJW。 IJW是magically better,并且将C ++程序编译成单独的托管和非托管DLL这样的机制(因此P/Invoke
甚至适用)是deprecated,从VS 2015开始,因此更新版本的SQLite可能会丢弃非捆绑包。
你应该仔细检查我的研究,因为我没有前一段中的任何直接证据。这是我的研究:
- https://docs.microsoft.com/en-us/cpp/dotnet/mixed-native-and-managed-assemblies?view=vs-2019
- https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/
- https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/interoperability-overview
- https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/8977675-do-not-remove-clr-pure-and-clr-safe-from-c-cli
以上是关于什么是混合模式组件?的主要内容,如果未能解决你的问题,请参考以下文章
错误记录Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )(代码片段