Как я могу создать объект C # из кода C? - PullRequest
1 голос
/ 19 июня 2009

Я использую небольшой C-сервер. Я делаю некоторые фактические обработки запросов с библиотеками C #.

Я использую слой клея, который кажется написанным на чем-то близком к c ++, чтобы соединить два мира. Он предоставляет «общедоступный класс ссылок», который я могу получить в мире C #.

Если я хочу извлечь несколько различных классов из этого в C #, как мне создать экземпляры этих производных классов из C / C ++?

Какую информацию (имя класса? Фабричная функция?) Я должен передать (и в какой форме) из C # в код C / C ++?

Мне нужно решение, совместимое с .NET 2.0, и я использую Visual Studio 2008 для создания своего кода.

Ответы [ 3 ]

2 голосов
/ 22 июня 2009

Я несколько раз осознавал, что иногда люди не совсем осознают разницу между управляемым и неуправляемым кодом, поэтому я просто хотел бы подвести итог:

  1. Вы не можете просто вызвать управляемый код из собственного приложения C ++. Для того, чтобы вызвать его, вам сначала нужно представить свой код .Net для COM, а затем создать экземпляр COM-объекта в C ++. Таким образом, ваше нативное приложение думает, что оно создает COM-объект, как и любой другой, а .Net выполняет все взаимодействия во время выполнения.

  2. Второй способ - использовать управляемый C ++ / CLI (который не является родным C ++, но поддерживает оба мира). Таким образом, приложения C ++ и C # управляются и могут беспрепятственно взаимодействовать. Поэтому, пока «клеевой слой» написан с использованием управляемого C ++ / CLI, вы можете работать как с собственными, так и с управляемыми данными.

Как вы уже упомянули в качестве неуправляемого C ++, тогда ответом было бы пойти на первое решение: открыть управляемый объект для собственного мира через взаимодействие COM. Если вы не возражаете против использования управляемого C ++ / CLI, у вас есть более простое решение - вы можете легко создавать экземпляры управляемых классов (с некоторыми изменениями в синтаксисе, к которым вы должны быстро привыкнуть).

1 голос
/ 19 июня 2009

Используйте директиву #using для импорта сборки C # в код C ++.

#using "ThingLib.dll"
using namespace ThingLib;

Если вы хотите, чтобы код C ++ знал только о базовом классе, вам нужно вызвать какой-то фабричный метод.

ThingBase^ thing = myThingFactory.MakeThing(aParameter);

Если вы хотите на самом деле создать производные классы в C ++, используйте оператор gcnew.

ThingBase^ thing = gcnew DerivedThing(aParameter);

Здесь приводится краткое описание новых возможностей языка C ++ для общения с управляемым кодом: http://msdn.microsoft.com/en-us/library/xey702bw.aspx

1 голос
/ 19 июня 2009

См. Как вызвать управляемую DLL из собственного кода Visual C ++ в Visual Studio.NET или в Visual Studio 2005 .

http://support.microsoft.com/kb/828736

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