Нужно вернуть строку с кода написанного на С++ в С#.
Код на С++:
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);
}
}
Для управления подобными ситуациями существует атрибут MarshalAsAttribute:
[DllImport(DllPath)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string GetString();
Придется делать вот так:
[DllImport("CppDll.dll", EntryPoint= "GetString")]
private static extern IntPtr _GetString();
public static string GetString() => Marshal.PtrToStringAnsi(_GetString());
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости