powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / struct C++/CLI => C#
9 сообщений из 9, страница 1 из 1
struct C++/CLI => C#
    #38884143
ppcat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый.
Бьюсь над проблемкой. Нужно передать структуру из 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
struct C++/CLI => C#
    #38884189
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Основных способа два - формировать на C++ DLL с функциями и подключать через DllImportAttribute; формировать на С++ COM DLL и подключать как обычный reference с описанием интерфейсов на IDL. Lib'ы и т. д. .Net не поддерживает (хотя Mono их поддерживает).
...
Рейтинг: 0 / 0
struct C++/CLI => C#
    #38884202
ppcat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но со строками подобное прокатывает.

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


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

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


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