Как вернуть строку черз маршалинг

192
01 июня 2018, 18:50

Нужно вернуть строку с кода написанного на С++ в С#.

Код на С++:

extern "C"
__declspec(dllexport)
char* GetString()
{
char* someString=new char[10] {"Hello"};
return someString;
}
extern "C"
__declspec(dllexport)
void Test()
{
cout << "Test";
}

Код на C#:

internal static class NativeMethods
{
private const string DllPath = @"..\..\..\Debug\VirtualFolder.dll";
    [DllImport(DllPath)]
    public static extern string GetString();
    [DllImport(DllPath)]
    public static extern void Test();
}
class Program
{
    static void Main(string[] args)
    {
        NativeMethods.Test(); // Test на экране
        string name = NativeMethods.GetString(); // ошибка на этапе выполнения
        Console.Write(name);
    }
}
Answer 1

Для управления подобными ситуациями существует атрибут MarshalAsAttribute:

[DllImport(DllPath)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string GetString();

Answer 2

Придется делать вот так:

[DllImport("CppDll.dll", EntryPoint= "GetString")]
private static extern IntPtr _GetString();
public static string GetString() => Marshal.PtrToStringAnsi(_GetString());
READ ALSO
Реализация корзины магазина в EntityFramework

Реализация корзины магазина в EntityFramework

База данных интернет магазинаЕсть два класса

186
Remove range в EF Core и транзакция

Remove range в EF Core и транзакция

Когда мы производим удаление с помощью Remove range в ef core у нас все выполняется в транзакции? Если, что то не удалится из списка удаляемых объектов...

190
Yii2 ActiveQuery сложный запрос

Yii2 ActiveQuery сложный запрос

Есть 2 таблицы: user и transactionСвязь один ко многим (1 пользователь – много транзакций)

300
Вывод отдельной записи

Вывод отдельной записи

У меня есть программа в которой выводятся данные в QTableView из таблицы mysqlКак реализовать что бы при нажатии на запись таблицы в списке подробная...

191