Обертывание управляемого кода для неуправляемого использования - PullRequest
3 голосов
/ 30 марта 2012

У нас есть большой проект C ++, который скомпилирован как собственный неуправляемый код. Нам нужно использовать функцию из управляемого кода, но мы не хотим компилировать весь проект в /clr.

.

Итак, я создал DLL, у меня есть класс ref с именем B, который отображается в экспортированном собственном классе A. Проблема в том, что я получаю C1190: управляемому целевому коду требуется параметр '/ clr' из-за включения vcclr.h.

Я хотел бы знать, есть ли способ создать какой-то интерфейс, который будет иметь управляемый код в неуправляемых методах.

Вот мой код:

#pragma once
#include "EX_Port.h"
#include <vcclr.h>

ref class B;

class EX_API A
{
    public:
        A();        
        int DeviceCount();

    private:
        gcroot<B^> _device;
};

Мне удалось заставить его работать с помощью gcnew класса B внутри cpp. Но тогда у меня есть локальный объект, в то время как я хотел бы иметь его в глобальной области видимости. Я только начал заниматься программированием на CLI, поэтому я мог не знать о некоторых практиках.

Спасибо

1 Ответ

6 голосов
/ 30 марта 2012

Ваша большая программа на C ++ должна будет загрузить и инициализировать CLR, прежде чем она сможет выполнить какой-либо управляемый код.Есть несколько способов сделать это, от самых гибких до минимальных:

  • Он может использовать интерфейс хостинга CLR для явной загрузки CLR и выполнения произвольного управляемого кода.Основой для этого является страница MSDN и множество примеров, которые вы можете найти на таких сайтах, как CodeProject.com

  • Вы можете создавать управляемые классы [ComVisible].Затем ваш код C ++ может использовать стандартные методы программирования COM для создания экземпляра управляемого класса и вызова его методов (CoInitializeEx и CoCreateInstance, директива #import).COM-соединение гарантирует, что CLR автоматически загружается и загружается надлежащая сборка, никакого дополнительного кода для управления этим не требуется.Рассмотрите этот вариант, если у вас уже есть инвестиции в COM, а не то, что вы должны учитывать, если у вас нет практических знаний о COM.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...