【问题标题】:What is a mixed mode assembly?什么是混合模式装配?
【发布时间】:2011-11-08 04:16:21
【问题描述】:

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

我有两个问题:

  1. 什么是混合模式程序集?谷歌返回了一系列令人困惑的答案,这些答案都没有多大意义。一个答案表明这完全是为了混合原生代码和托管代码,而其他人则声称它是为了混合 .Net 版本。
  2. 我的情况应该下载哪个?

【问题讨论】:

    标签: sqlite .net-4.0 assemblies system.data.sqlite


    【解决方案1】:

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

    【讨论】:

    • 那么有效的混合模式程序集总是用 C++ 编写的?
    • 你说我应该使用混合模式程序集。我仍然不清楚为什么。
    • 因为只有混合模式的程序集。这是因为 sqlite 的“功能”是用 C (COM) 编写的,您可以通过 .NET 的包装器访问它。所以程序集包含 C 和 C# 代码 --> 混合模式程序集。
    • 啊,现在我明白你的意思了。不同的是,混合模式程序集是 1 个包含功能和 .NET 包装器的 .dll 文件。如果您不使用混合模式程序集,您将有一个 SQLite.dll 和第二个 DLL(SQlite.Interop.dll 或者他们调用它)作为包装器,因此您在 1 个 dll 中没有混合代码
    • SQLite3.dll 和 SQLite.Interop.dll 都没有托管代码 - 请参阅 here 。如果不使用“System.Data.SQLite.dll”混合模式程序集,则必须使用另一个“System.Data.SQLite.dll”和“SQLite.Interop.dll”文件,其中包含托管代码和本机代码,分别 - 见here
    【解决方案2】:

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

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

    不用说,这些信息来之不易...

    【讨论】:

      【解决方案3】:

      取自官方FAQ

      (14) 什么是混合模式程序集?

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

      它甚至引用了这个问题!

      【讨论】:

        【解决方案4】:

        对于 SQLite,该包包含一个用于 System.Data.SQLite 的混合模式程序集;但是,默认包包含两个单独的程序集,一个完全是本机程序集,另一个是完全托管的互操作程序集。

        在 SQLite 网站上实际上有一个 FAQ

        (15) 什么是“捆绑”包(即来自下载页面)?

        下载页面上列出的“捆绑包”包含 System.Data.SQLite 混合模式程序集在一个名为的文件中 “System.Data.SQLite.dll”(参见问题 #14)而不是单独的 “System.Data.SQLite.dll”和“SQLite.Interop.dll”文件包含 分别是托管代码和本机代码。

        以及之前的常见问题解答:

        (14) 什么是混合模式程序集?

        混合模式程序集是一个动态链接库,它同时包含 特定处理器架构的托管代码和本机代码。 由于它包含本机代码,因此只能加载到进程中 与编译它的处理器架构相匹配。另见 这个StackOverflow question

        为什么有两种选择?

        Based on my research,非捆绑形式可用,因此您可以在托管代码(例如 C#)中使用 P/Invoke 来调用非托管代码,而不是使用 IJW。 IJW 是 magically better,并且像这样将 C++ 程序编译成单独的托管和非托管 DLL 的机制(因此 P/Invoke 甚至适用)在 VS 2015 中是 deprecated,因此较新版本的 SQLite 可能会放弃非捆绑包。

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

        【讨论】:

        • 我认为有两个选项的另一个原因是 AnyCpu 项目。
        猜你喜欢
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 2021-07-25
        • 2016-10-19
        • 2021-09-24
        • 1970-01-01
        相关资源
        最近更新 更多