2013-03-21 1 views
3

Microsoft OpenXML SDK версии 2.0 поставляется с ~ 5111 библиотекой KiB .NET (DLL) и ~ 14436 KiB несжатым XML-файлом. Оба эти файла необходимы для успешного использования SDK. (Важное обновление: требуется только файл DLL, а XML это просто API документация для программиста !!)Вставить файлы SDK OpenXML в .NET Исполняемый файл

Я написал программу, используя SDK, который работает и я доволен. Тем не менее, я сжал данные SDK OpenXML (DLL и XML) с использованием LZMA2, и результатом является только 1287 KiB. Экономия составляет 18260 KiB, что может занять не менее нескольких секунд, вплоть до нескольких минут, для передачи по средней линии WAN.

Я загрузил LZMA SDK от 7-zip.org, который реализует сжатие и декомпрессию LZMA примерно в 45 KiB скомпилированного MSIL (как скомпилировано .NET Framework 4.0).

Моя цель - сжать ресурсы (используя что-то вроде 7-Zip), сохранить их в сборке (.exe), а затем распаковать их и загрузить. Я знаю, как использовать 7-Zip SDK для декомпрессии. У меня есть две проблемы таким образом:

  1. Как загрузить сборку OpenXML SDK (.dll) в запущенный процесс .NET без записи на диск? Предположим, у меня есть байт [] несжатых байтов DLL; Я сам позабочусь об упаковке ресурсов в исполняемый файл.

  2. Как сообщить сборке загрузить схему OpenXML (DocumentFormat.OpenXml.xml) из памяти, не записывая ее на диск? Предположим, у меня есть байт [] или строка, содержащая несжатый XML. Опять же, я сам позабочусь о декомпрессии и упаковке ресурсов.

+0

Эй, какой хороший код, если он не задокументирован, не так ли? : D –

ответ

3

Использовать соответствующую перегрузку Assembly.Load после декомпрессии до byte[]. Файл DocumentFormat.OpenXML.xml не требуется для выполнения приложения. Это просто документация API для разработчиков. Он используется Visual Studio для отображения информации в Intellisense.

Вы должны сделать dll (или сжатую dll) встроенным ресурсом и использовать событие AppDomain.AssemblyResolve для загрузки SDK по его запросу. Существует несколько примеров кода here.

+0

Спасибо, но в конечном итоге я использовал ключевое слово 'dynamic' для позднего связывания в моем первоначальном подходе, который включал ручную декомпрессию. Спасибо за информацию о файле XML. Как только я понял, как неудобно и неудержимо, что сделал мой код, я обнаружил [.NETZ] (http://madebits.com/netz/index.php), который делает именно то, что я хочу, не изменяя свой собственный код вообще. – allquixotic

1

Предполагая, что вы не можете просто распаковать DLL, рядом с исполняемым во время установки (что, безусловно, самый простой вариант), я предлагаю смотреть в Assemby.Load(byte[]).

Что касается DocumentFormat.OpenXml.xml, я не знаком с этим, но я нашел, что он нужен только для разработки, а не для развертывания.

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

  • Нет связанных вопросов^_^