Передача объекта в качестве параметра в функции-оболочке c/CLI для экспорта в родную dll Win32

Недавно я работал над COM-взаимодействием. Прочитайте несколько хороших книг об этом C++/CLI в действии Нишанта Шивакумара. Я также прошел по этой ссылке Srinivas, где он прекрасно объяснил, как использовать C#. библиотека на родном C++ с использованием C++/CLI. Я загрузил код, представленный внизу страницы.. Прочитал его.. Мне он понравился. Мое приложение частично основано на нем. У меня есть вопрос, хотя в этом примере (который вы можете скачать его там). В библиотеке С# "Worker.cs", если у меня есть метод в классе Worker с такой подписью:

public void GetStudent(ManagedStudent student,int ){....}

К вашему сведению: мне нужен параметр объекта, потому что я буду обращаться к методу из этого класса в рабочем классе.

В проекте оболочки C++/CLI, NativeInterface.h, я хотел экспортировать метод, который получает этот управляемый объект в качестве параметра, в отличие от примера.

__declspec dllexport void GetStudent(ManagedStudent^ obj)

Что эквивалентно объекту в C++/CLI?

А позже я хочу получить доступ к этому методу, импортировав этот метод, передав объект в моем собственном приложении Win32/DLL. Я включаю файл «NativeInterface.h» в свою родную dll/App. Но при создании dll/приложения возникает ошибка. Управляемый целевой код требует опции \clr.

FYI:: 1. Моя dll/приложение WIN32 компилируется без поддержки \clr, а моя оболочка с поддержкой \clr 2. Я считаю, что ошибка возникает из-за дескриптора, используемого в качестве параметра? Я хочу получить доступ к UnmanagedStudent(Object obj) в родном приложении/dll; Это возможно


person Pratik Pattanayak    schedule 01.06.2013    source источник
comment
Вы можете определить ManagedStudent как COM-объект, чтобы любой язык в мире, поддерживающий COM, мог получить к нему естественный доступ.   -  person Simon Mourier    schedule 02.06.2013


Ответы (1)


Это возможно, но вы не можете передать объект .NET в нативную DLL, которая является нативным кодом С++... Эквивалентом объекта .NET в нативном С++ является объект С++... но это все равно что спрашивать С# чтобы понять Native или PHP, или.... Итак, есть несколько подходов.

Не используйте управляемую оболочку C++. Вместо этого использование совместимости Marsahling и C# напрямую вызывает собственный C++ одним из двух способов:

  1. Передайте поля объекта в виде длинного списка параметров в C++ и повторно создайте объект внутри собственного C++. Немного "нехороший" подход, но очень эффективный и простой в отладке.
  2. Вы также можете передать объект в качестве указателя класса непосредственно на С++, вам нужно сначала создать правильное маршалирование в С#. См. здесь: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal(v=vs.110).aspx

Используйте С++ Interop (что вы делаете...). Вам нужно скомпилировать в смешанном режиме! См. этот хороший пример: http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/f2de75c5-50a6-41ac-9ddf-694a8c0ce75b/ НО... вам нужно понимать основы и уметь компилировать это: http://msdn.microsoft.com/en-us/library/x0w2664k.aspx

Интероперабельность - сложный вопрос... и я пытаюсь написать краткий ответ, пожалуйста, обращайтесь ко мне за дальнейшими разъяснениями....

person Amit Shkolnik    schedule 01.06.2013