Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / struct C++/CLI => C# / 9 сообщений из 9, страница 1 из 1
19.02.2015, 15:52
    #38884143
ppcat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
Добрый.
Бьюсь над проблемкой. Нужно передать структуру из C++/CLI в C#.
В одном солюшене есть 2 проекта C# и C++/CLI.
В C# проекте вызовом SomeCppClass.getA() (или так: SomeCppClass.getA(ref A), все равно) нужно получить структуру.

=== С++/CLI ===
public struct A{
public:
double l;
doublr r;
}

=== C# ===
public struct{
public double l;
public double r;
}

A a = SomeCppClass.getA();

Есть много примеров, как из DLL ф-и вызывать, типа:
[DllImport("mydll.dll")]
static extern int (ref MathInputStructType input,...
Хочу подчеркнуть, нет никакой DLL, есть C++/CLI
...
Рейтинг: 0 / 0
19.02.2015, 16:23
    #38884189
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
Основных способа два - формировать на C++ DLL с функциями и подключать через DllImportAttribute; формировать на С++ COM DLL и подключать как обычный reference с описанием интерфейсов на IDL. Lib'ы и т. д. .Net не поддерживает (хотя Mono их поддерживает).
...
Рейтинг: 0 / 0
19.02.2015, 16:35
    #38884202
ppcat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
Но со строками подобное прокатывает.

=== C++/CLI ===
bool LoadMedia(String^ value)
{
System::IntPtr name = Marshal::StringToHGlobalAnsi(value);
const char* ccName = (const char*)(void*)name;
libvlc_media_t* media = libvlc_media_new_path(vlcInstance, ccName);
Marshal::FreeHGlobal(name);
}

=== C# ===
player.LoadMedia(name);

Это код работает.
...
Рейтинг: 0 / 0
19.02.2015, 16:42
    #38884212
Ilya81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
Теперь понял, о чём речь. Если не путаю, нужно в C++ пометить __value (или что-то такое).
...
Рейтинг: 0 / 0
19.02.2015, 16:43
    #38884213
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
Ничего не нужно специально делать, никакого маршвллинга, в C++ объявить структуру и класс - managed
в c# - просто референс на сборку
...
Рейтинг: 0 / 0
19.02.2015, 16:47
    #38884221
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
примерно так


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
namespace ClassLibrary1 {

	public value class MyStruct
	{
	public:
		double a;
		double b;
	};

	public ref class Class1
	{
	public:
		static MyStruct tt(){
			MyStruct t = {0.5, 0.33};
			return t;
		};
	};
}

...
Рейтинг: 0 / 0
19.02.2015, 17:10
    #38884249
ppcat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
Изопропил, кажется - то, что надо. Типа враппер.
Только подробнее бы.
Как будет выглядеть функ. getMyStruct на стороне C++
И как к ней обратиться на стороне C#.
...
Рейтинг: 0 / 0
19.02.2015, 17:21
    #38884262
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
ppcatКак будет выглядеть функ. getMyStruct на стороне C++
как статический метод класса - в примере - tt()

ppcatИ как к ней обратиться на стороне C#.
как обычно, в примере будет
Код: c#
1.
2.
3.
using ClassLibrary1;
...
MyStruct y = Class1.tt();
...
Рейтинг: 0 / 0
20.02.2015, 10:25
    #38884723
ppcat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
struct C++/CLI => C#
Спасибо Изопропил. Это реально работает.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / struct C++/CLI => C# / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]