Что такое сборка смешанного режима? - PullRequest
39 голосов
/ 01 сентября 2011

Я смотрю на загрузку System.Data.SQLite page , и в ней перечислены сборки смешанного режима для .NET 4 и обычная (я полагаю).Мой проект, который будет использовать эту библиотеку, - это все .NET 4, которое будет скомпилировано в x86.

У меня есть 2 вопроса:

  1. Что такое сборка в смешанном режиме?Google возвращает запутанный массив ответов, ни один из которых не имеет большого смысла.В одном ответе говорится, что все дело в смешивании собственного и управляемого кода, в то время как другие утверждают, что он смешивает версии .Net.
  2. Какую загрузку я должен получить для моей ситуации?

Ответы [ 4 ]

33 голосов
/ 01 сентября 2011

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 голосов
/ 28 февраля 2013

Существует способ получения сборки смешанного режима из чистого IL.Заключительная часть создания сборки с использованием отражения включает вызов AssemblyBuilder.Save .Если вы просто передадите PortableExecutableKinds.Required32Bit в качестве аргумента portableExecutableKind, то создадите сборку в смешанном режиме.Вы можете избежать проблем, которые это вызывает, также передав PortableExecutableKinds.ILOnly.то есть


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

Излишне говорить, что эта информация была трудно завоевана ...

5 голосов
/ 24 ноября 2013

Взято из официального FAQ

(14) Что такое сборка в смешанном режиме?

Сборка в смешанном режиме - это библиотека динамических ссылоккоторый содержит как управляемый код, так и собственный код для конкретной архитектуры процессора.Поскольку он содержит собственный код, он может быть загружен только в процесс, который соответствует архитектуре процессора, для которой он был скомпилирован.Также смотрите этот вопрос StackOverflow.

Он даже ссылается на этот вопрос!

0 голосов
/ 23 апреля 2019

Для SQLite пакет содержит сборку смешанного режима для System.Data.SQLite; однако пакет по умолчанию содержит две отдельные сборки, одна полностью нативная, а другая - сборка взаимодействия, которая полностью управляется.

На самом деле на этом сайте SQLite есть FAQ .

(15) Что такое пакетный пакет (т.е. со страницы загрузки)?

Пакеты "bundle", перечисленные на странице загрузки, содержат Сборка смешанного режима System.Data.SQLite в файле с именем «System.Data.SQLite.dll» (см. Вопрос № 14) вместо отдельного Файлы «System.Data.SQLite.dll» и «SQLite.Interop.dll», содержащие управляемый код и собственный код соответственно.

И предыдущий FAQ:

(14) Что такое сборка в смешанном режиме?

Сборка в смешанном режиме - это библиотека динамических ссылок, которая содержит управляемый код и собственный код для конкретной архитектуры процессора. Поскольку он содержит собственный код, он может быть загружен только в процесс соответствует архитектуре процессора, для которой он был скомпилирован. Также см это вопрос StackOverflow .

Почему есть два варианта?

На основании моего исследования доступна не связанная форма, так что вы можете использовать P/Invoke в управляемом коде (например, C #) для вызова неуправляемого кода вместо использования IJW . IJW магически лучше , и механизм компиляции программы на C ++ в отдельные управляемые и неуправляемые библиотеки DLL, подобные этой (так что P/Invoke даже применяется), устарел по сравнению с VS 2015, поэтому более новые версии SQLite могут отбрасывать не связанный пакет.

Вы должны перепроверить мои исследования, поскольку у меня нет прямых доказательств чего-либо в предыдущем абзаце. Вот мое исследование:

...