什么是混合模式组件?

问题描述 投票:39回答:4

我正在查看System.Data.SQLite下载page,它列出了.NET 4的混合模式程序集和常规(我假设)。我将要使用这个库的项目是.NET 4,它将被编译为x86。

我有两个问题:

  1. 什么是混合模式组件?谷歌回复了一系列令人困惑的答案,但这些答案都没有多大意义。一个答案表明,所有这些都是关于混合原生代码和托管代码,而其他人则认为它混合了.Net版本。
  2. 我应该从哪个下载中找到我的情况?
sqlite .net-4.0 assemblies system.data.sqlite
4个回答
33
投票

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。”


6
投票

有一种方法可以从纯IL生成混合模式组件。使用反射创建装配的最后一部分涉及对AssemblyBuilder.Save的调用。如果只是为PortableExecutableKind参数传递PortableExecutableKinds.Required32Bit,那么您将创建一个混合模式程序集。您还可以通过传递PortableExecutableKinds.ILOnly来避免此问题。即


    assembly_bldr.Save(exe_name, PortableExecutableKinds.Required32Bit | PortableExecutableKinds.ILOnly, ImageFileMachine.I386 );

毋庸置疑,这些信息很难获得......


5
投票

取自官方FAQ

(14)什么是混合模式组件?

混合模式程序集是一个动态链接库,它包含特定处理器体系结构的托管代码和本机代码。由于它包含本机代码,因此只能将其加载到与其编译的处理器体系结构相匹配的进程中。另请参阅此StackOverflow问题。

它甚至引用了这个问题!


0
投票

对于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可能会丢弃非捆绑包。

你应该仔细检查我的研究,因为我没有前一段中的任何直接证据。这是我的研究:

© www.soinside.com 2019 - 2024. All rights reserved.