Связать предварительно скомпилированный файл MSIL в сборку? - PullRequest
1 голос
/ 06 октября 2011

Есть ли способ предварительно скомпилировать файл MSIL, а затем связать компоновщик .net с компоновкой .net во время компиляции?

Так, например.У меня есть проект.Я компилирую его, декомпилирую в MSIL и настраиваю msil.

Теперь я хотел бы скомпилировать и связать этот настроенный файл msil с другим проектом.

Да, я + COULD +перекомпилировать его как отдельную сборку и просто ссылаться на него, но в данном конкретном случае я не могу этого сделать.Содержимое MSIL должно находиться в целевой сборке.

Есть идеи, если это вообще возможно?Пока что мне не повезло найти что-либо.

- РЕДАКТИРОВАТЬ - Одним из предложений является ILMerge, который может работать.Я сейчас возьму последнюю копию и посмотрю, как это будет.Единственная проблема, с которой я столкнулся, заключается в том, что в прошлом я обнаружил, что отладка после слияния трудна (или, по крайней мере, более трудна, чем если бы я не использовал ILmerge).Я надеялся настроить файл proj для включения скомпилированного MSIL непосредственно в процессе сборки, поэтому в IDE все будет легко отлаживаться.

- РЕДАКТИРОВАТЬ - Ну, похоже, ILMerge не будет работать для этого сценария. Сначала я получил следующее сообщение: Возникла исключительная ситуация при объединении: (TaskId: 32) ILMerge.Merge: сборка 'Blah'не помечен как содержащий только управляемый код.(TaskId: 32) (Рассмотрите возможность использования параметра / zeroPeKind - но сначала прочтите документацию!) (TaskId: 32) в ILMerging.ILMerge.Merge () (TaskId: 32) в ILMerging.ILMerge.Main (String [] args) (TaskId: 32)

ОК.Итак, какого черта, я добавляю / zeropekind и пытаюсь снова.

Без ошибок!

Но, в этом конкретном случае, объединяемая DLL имеет несколько функций, настроенных в MSIL дляэкспортироваться как функции CDECL.В объединенной dll они больше не экспортируются.

Крысы.

Вернуться на круги своя.

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Вы можете использовать ILMerge для объединения нескольких сборок в одну, чтобы вы могли настроить свой msil, сделать его отдельной сборкой, а затем ILMerge превратить его в свою первую.

Другой вариант будетзагрузить ваш настроенный MSIL как встроенный ресурс в вашей первой сборке (что будет означать, что ваша измененная сборка msil должна быть создана до той, которая ссылается на него), тогда во время выполнения вы можете прочитать байт [] встроенного ресурса вСборка, загруженная в домен приложений.

Третий, более радикальный подход заключается в декомпиляции обеих сборок, объединении выходных файлов msil в 1 и перестройке его в сборку.Вам просто нужно остерегаться конфликтов имен между двумя наборами кода MSIL, но, поскольку вы можете записать MSIL в плоский текстовый файл, не составит труда написать какую-нибудь служебную программу для их рекомбинации ... хотяТо есть, в основном это именно то, чем является ILMerge, за исключением того, что он начинается с 2 сборок, вместо кода MSIL в текстовом файле ...

0 голосов
/ 17 декабря 2011

Как упоминалось ранее, используйте ILMerge для объединения сборок.

Также вы можете использовать утилиту DLLExport для предоставления функций, помеченных как CDECL.

Смотрите эти ссылки:
http://www.darinhiggins.com/self-registering-com-net-assemblies/
http://www.vbfengshui.com/exposing-c-style-entry-points-in-a-net-assembly-revisited/

...