Как экспортировать метод в CIL DLL, чтобы его могла вызвать нативная программа? - PullRequest
8 голосов
/ 22 января 2012

Я просмотрел ECMA 335 и нашел только ссылку на ключевое слово .export, которое кажется многообещающим, но содержит очень мало документации.Я нашел похожие вопросы на StackOverflow в отношении этого в C #.Однако ничто из этого пока не привело меня к чему-то полезному.

Суть в том, что у меня есть CIL DLL, и я хочу вызвать некоторые из ее статических методов из собственного приложения C ++.

Ответы [ 2 ]

13 голосов
/ 22 января 2012

В более новых версиях ILAsm вы можете просто сделать:

.method public static void Foo ()
{
    .export [1]

    // code ...
}

Это экспортирует Foo по индексу 1 в таблице экспорта.Порядковые номера экспорта должны быть уникальными и последовательными.

В более старых версиях вам нужно будет выполнить:

.data vt = int32 (0) [n]
.vtfixup [n] int32 fromunmanaged at vt

.method public static void Foo ()
{
    .vtentry 1:1
    .export [1]

    // code ...
}

(где 'n' - это количество экспорта, которое вы хотите.)

.vtentry указывает, в каком vtable: слоте для хранения метода. (Идентификаторы таблицы являются последовательными и, следовательно, зависят от порядка объявления.)

Более новые ILAsms выполняют всю эту работу за вас, при условиивы не используете таблицу экспорта ни для чего другого.

Обратите внимание, что все это очень непереносимо.

1 голос
/ 22 января 2012

Вы должны выставить свою dll как com dll. Com выполняет всю работу по взаимодействию с .net. Вы не можете запускать код IL ни в чем, кроме виртуальной машины .net.

...