Как я могу использовать C # dll в проекте Win32 C ++? - PullRequest
4 голосов
/ 15 марта 2010

Я работаю над решением, большая часть его основного движка разработана как Win32 C ++ (и не зависит от платформы и также используется в OS X), некоторое время назад нам нужно было вызывать C ++ dll ядра ядра из C #, и я смог загрузить DLL основного решения в C # (с помощью некоторых потоков здесь, на SO). но теперь у нас есть определенные вещи, реализованные в Managed C # dll, и нам нужно использовать это в проекте Win32 C ++? (и предоставляются только определения функций и dll)

Ответы [ 3 ]

8 голосов
/ 23 марта 2010

Вы можете создать управляемую DLL взаимодействия C ++, которая будет действовать как оболочка для библиотеки C #.

Большинство учебников по управляемому C ++, к сожалению, только объясняют, как обернуть неуправляемый C ++ для использования в C #. Но это может работать и по-другому.

Определите абстрактный интерфейсный класс в своем родном коде C ++, затем создайте конкретный подкласс в управляемой C ++ DLL. Вызовите ваши объекты C # в реализациях методов.

Наконец, экспортируйте фабричную функцию, которая будет создавать экземпляр класса реализации и возвращать указатель базового класса, который может использовать ваш собственный код.

Вот краткий пример:

Сначала определите интерфейс класса в своей собственной DLL.

interopclassbase.h

class InteropClassBase
{
public:
    virtual void doStuff() = 0;
    virtual int getValue() = 0;
    virtual void getString(CString* outStr) = 0;
};

Теперь вам нужно создать C ++ / CLI DLL, которая позволит вам смешивать собственный и управляемый код в одной сборке. Добавьте новый проект C ++ в свое решение, и в конфигурации проекта установите «Поддержка поддержки общего языка» *1019* на Смешанный (/ clr).

Как только вы добавите ссылку на вашу библиотеку C # (которую мы будем называть ManagedLibrary), мы можем реализовать класс взаимодействия:

interopclass.cpp

#include "interopclassbase.h"
#include <vcclr.h>

public class InteropClass : public InteropClassBase
{
protected:
    gcroot<ManagedLibrary::ManagedObject^> m_managedObject;

public:
    InteropClass()
    {
        m_managedObject = gcnew ManagedLibrary::ManagedObject();
    }

    virtual void doStuff()
    {
        m_managedObject->doStuff();
    }

    virtual int getValue()
    {
        return m_managedObject->getValue();
    }

    virtual void getString(CString* pOutStr)
    {
        System::String^ managedString = m_managedObject->getString();
        CString nativeString(managedString); // overloaded CString constructor
        if (pOutStr) *pOutStr = nativeString;
    }
};

__declspec(dllexport) InteropClassBase* getImplementationPointer()
{
   return new InteropClass();
}

Теперь вам просто нужно загрузить DLL взаимодействия из вашего собственного проекта и вызвать экспортированную функцию.

3 голосов
/ 15 марта 2010

Одним из решений является COM Interop. Возможно, единственное решение. Это большая тема. На работе есть большая толстая голубая книга. Сотни страниц, кроме COM Interop.

Короткая версия заключается в том, что вы помечаете некоторые классы и интерфейсы на управляемой стороне и создаете сборки взаимодействия, которые выглядят как COM-библиотеки, но на самом деле являются прокси для управляемых сборок. Сборки взаимодействия регистрируются как COM dll и все готово.

MSDN имеет много информации об этом.

Это, вероятно, хорошая отправная точка. «Предоставление компонентов .NET Framework для COM» http://msdn.microsoft.com/en-us/library/aa720072%28VS.71%29.aspx

Это может быть удивительно легким, но постарайтесь сделать его простым.

0 голосов
/ 23 марта 2010

Чтобы создать управляемый объект и вызвать для него методы, вам нужно, чтобы CLR работал в вашем процессе C ++.

В Windows вы можете разместить CLR, сославшись на mscoree.dll и разместив CLR в процессе.

http://msdn.microsoft.com/en-us/magazine/cc163567.aspx
http://msdn.microsoft.com/en-us/library/ms230997.aspx

Для Mono вы можете встроить среду выполнения Mono в свое приложение C ++.

http://www.mono -project.com / Embedding_Mono

...