Да, компилятор C ++ / CLI делает это легко.Он автоматически генерирует «thunk», который гарантирует, что CLR загружается, когда неуправляемая программа вызывает экспортированную функцию.Лучше всего продемонстрировать на примере.
Начиная с кода C #, создайте новый проект из шаблона проекта библиотеки классов.Вам придется написать статический метод, необходимый, потому что код C ничего не знает о классах.Вот простой пример:
using System;
namespace ClassLibrary1 {
public static class Mumble {
public static int method(int arg) { return arg; }
}
}
Щелкните правой кнопкой мыши имя решения в окне обозревателя решений, Добавить + новый проект.Выберите Visual C ++, CLR, библиотека классов.Щелкните правой кнопкой мыши новый проект, Свойства, Общие свойства, Каркас и Ссылки, нажмите Добавить новую ссылку.На вкладке "Projects" выберите проект C #.
Откройте файл .cpp и напишите код, подобный следующему:
#include "stdafx.h"
using namespace ClassLibrary1;
extern "C" __declspec(dllexport)
int method(int arg) {
return Mumble::method(arg);
}
Build.Теперь эта DLL может использоваться вашим неуправляемым кодом, она может вызывать функцию «method».Как эту DLL, так и вашу C # DLL необходимо скопировать в каталог неуправляемой программы.
Остерегайтесь накладных расходов при вызове этого метода.Thunk, который генерирует компилятор C ++ / CLI, выполняет большую часть работы, чтобы гарантировать, что CLR загружен и инициализирован.Отладка будет отменена (используйте Debugger.Break ()), а необработанные управляемые исключения приведут к аварийному завершению вашей программы с очень плохой диагностикой.