Как вызвать библиотеки DLL C ++ / CLI (.NET) из стандартных неуправляемых приложений, отличных от .NET?

В неуправляемом мире я мог написать __declspec (dllexport) или, в качестве альтернативы, использовать файл .DEF, чтобы предоставить функцию для вызова библиотеки DLL. (Из-за искажения имен в C ++ для __stdcall я помещаю псевдонимы в файл .DEF, чтобы определенные приложения могли повторно использовать определенные экспортируемые функции DLL.) Теперь я заинтересован в том, чтобы иметь возможность предоставлять одну функцию точки входа из Сборка .NET в неуправляемом режиме, но должна входить в функции в стиле .NET в DLL. Возможно ли это простым и понятным способом?

У меня есть сторонняя программа, которую я расширил с помощью библиотек DLL (плагинов), реализующих сложную математику. Однако у сторонней программы нет средств для визуализации расчетов. Я хочу каким-то образом взять эти заранее написанные математические функции, скомпилировать их в отдельную DLL (но с использованием C ++ / CLI в .NET), но затем добавить перехватчики к функциям, чтобы я мог отобразить то, что происходит под капотом в .NET. пользовательский контроль. Я не уверен, как совместить .NET-вещи с неуправляемыми и что делать Google для выполнения этой задачи.

Были бы полезны конкретные предложения относительно управляемого / неуправляемого моста или альтернативных методов для выполнения рендеринга описанным мной способом. Спасибо.


person user343400    schedule 17.05.2010    source источник


Ответы (3)


Что ж, компилятор C ++ / CLI делает это довольно просто. Просто напишите статическую управляемую функцию и присвойте ей атрибут __declspec (dllexport). Компилятор вставляет заглушку, которая автоматически загружает среду CLR для выполнения управляемого кода.

Это удобный подход, он не очень расширяемый и не очень быстрый. Следующим шагом будет написание класса ссылки с атрибутом [ComVisible (true)]. После регистрации в Regasm.exe любой неуправляемый клиент с поддержкой COM может использовать этот сервер. Самостоятельное размещение среды CLR (CorBindToRuntimeEx) обычно является последним, но наиболее универсальным вариантом.


Пример кода:

ref class ManagedClass {
public:
  static void StaticFunc() {}
};

extern "C" __declspec(dllexport)
void __stdcall UnmanagedFunc() {
  ManagedClass::StaticFunc();
}
person Hans Passant    schedule 17.05.2010
comment
Если мне нужно __stdcall в имени, и я хочу избавиться от @number в имени, искажающем имя, и мне нужно создать псевдоним в файле .DEF, как мне это сделать в этом случае? Мне нужна внешняя подпись в стиле C, чтобы ее можно было вызывать из определенного типа стороннего приложения. - person user343400; 21.05.2010
comment
Просто используйте extern C и деклараторы __stdcall при экспорте. Вам не нужен файл .def. Образец размещен. - person Hans Passant; 21.05.2010
comment
@HansPassant Что вы имеете в виду, когда компилятор вставляет заглушку? Создает ли компилятор .lib (и вызывающему UnmanagedFunc () нужно будет связать с библиотекой)? - person qqqqq; 14.01.2016
comment
Компилятор C ++ автоматически генерирует множество волшебного кода. Это работа компилятора, с его помощью, казалось бы, очень сложный код выглядит простым. Множественное наследование с виртуальными базовыми классами - это ракетостроение. Эта заглушка - намного проще. - person Hans Passant; 14.01.2016

Вы используете C ++ / CLI, потому что хотите или потому, что считаете необходимым экспортировать функции?

В случае последнего, ознакомьтесь с моим неуправляемым экспортом, который позволяет вам чтобы объявить неуправляемый экспорт в C # эквивалентным тому, как работает DllImport.

internal class Sample
{
  [DllExport("_export_test", CallingConvention.Cdecl)]
  static int Test(int a)
  {
     return a + 1;
  }
}
person Robert Giesecke    schedule 17.05.2010
comment
Я хотел использовать C ++ / CLI, потому что сторонняя библиотека компилируется автоматически, просто используя параметр / clr. Тогда добавление врезок в платформу .NET сделало бы жизнь намного лучше (я думаю). Ваш пример кажется разумным подходом. Спасибо. - person user343400; 18.05.2010
comment
Я не уверен, что слежу за вами здесь. Когда вы берете мой шаблон проекта, он также автоматически компилируется (он даже создает файл .lib). За исключением случаев, когда я вас неправильно понял, и вы действительно хотите использовать C ++ / CLI. - person Robert Giesecke; 18.05.2010

Эта статья CodeProject довольно хорошо объясняет этот процесс.

Использование управляемого кода в неуправляемом приложении
http://www.codeproject.com/KB/mcpp/ijw_unmanaged.aspx

См. Также здесь и здесь.

person Robert Harvey    schedule 17.05.2010