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

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

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

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

Ответы [ 3 ]

4 голосов
/ 18 мая 2010

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

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

internal class Sample
{
  [DllExport("_export_test", CallingConvention.Cdecl)]
  static int Test(int a)
  {
     return a + 1;
  }
}
4 голосов
/ 18 мая 2010

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

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


Пример кода:

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

extern "C" __declspec(dllexport)
void __stdcall UnmanagedFunc() {
  ManagedClass::StaticFunc();
}
3 голосов
/ 18 мая 2010

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

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

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

...