2010-04-27 3 views
7

SQLite от PHX Software объединил управляемую сборку (System.Data.SQLite) с неуправляемой dll (SQLite 32- или 64-разрядной dll) в один файл и сумел связать их вместе.Как объединить неуправляемую dll и управляемую сборку в один файл?

Как это сделать? Нужно ли встроить управляемую сборку в неуправляемую dll или наоборот?

ie. мои вопросы:

  1. В каком порядке это необходимо сделать?
  2. Какие инструменты или знания необходимы для этого?
  3. Как (если отличается) ссылку на экспортированные функции из неуправляемой DLL в моем управляемом коде?

Причина, по которой я спрашиваю об этом, заключается в том, что я хочу создать управляемую обертку zLib. Я знаю, что в .NET есть управляемые классы, но из-за их опыта они немного ограничены (и немного огорчены тем, что они не выполняют правильную буферизацию), поэтому я хотел бы создать свою собственную копию, также потому, что я хочу узнайте, как это сделать.

Так кто-нибудь знает, что мне нужно делать и как?

Я нашел следующее:

Я собираюсь попробовать это, но любая дополнительная информация будет хорошо, как хорошо.

+0

Подумайте дважды, прежде чем делать это, особенно с «основными» сборками. Если это не является основной особенностью вашего кода, лучше сделать такие сборки динамически загруженными.В другом случае любой, кто использует такую ​​сборку, должен будет сделать некоторые дополнительные шаги, чтобы убедиться, что она использует правильную версию (x86 vs x64), даже если он не использовал какой-либо ваш неуправляемый код. Это разумно для примера «System.Data.SQLite» (важная функция), но может быть неразумным в вашем случае. – SergGr

ответ

0

Вы пробовали использовать отражатель на System.Data.SQLite, чтобы посмотреть, как они это делают?

Я полагаю, вы могли бы:

  • Включите 32 и 64-битных библиотек в качестве ресурсов в управляемом сборки
  • Извлечь правильный в зависимости от разрядности, чтобы где-то
  • вызова SetDllDirectory() через PInvoke, если необходимо, чтобы окна можно найти извлеченный DLL
  • Instantiate 32 или 64 бит класс управляемой обертки, которая имеет ссылки на библиотеки DLL

Однако, поскольку zlib находится на C, вы также можете обернуть необходимые вам вызовы на C++, реализованном в CLR, с использованием источника zlib. Но я не уверен, как вы справитесь с битностью в этом случае.

+0

это возможно и обрабатывает как 32, так и 64-битные случаи. Однако это не так, как это сделано в sqlite. – vidstige

0

посмотреть профиль mergebin от sqlite Это должно быть то, что вы ищете.

он может объединять обе управляемые и неуправляемые собрания сборок.

MS также, кажется, есть Somthing сказать об использовании его here

+1

Ссылка на Microsoft не имеет значения. – vidstige

Смежные вопросы