[英]Return from C# lib a structure containing a string to c++ program
我正在嘗試從C ++程序調用C#庫。 C#和這個互操作對我來說是很新的。 在我不得不面對結構內部的字符串之前,某些溝通很容易。 我已經閱讀了很多,看到了幾個示例,但是我無法復制它們並使它們正常工作。
我以發送字符串並檢索有效的字符串為例提取了代碼(_string_exchange)。 和_return_struct方法,它返回一個帶有無效字符串的結構。 當我嘗試將變量用於std :: cout時,調試器失敗,但未處理的異常來自0x00007FFFEA98A388(KernelBase.dll)。 Console.WriteLine尚未在通話中寫任何東西。
我認為這是與腳本匹配的問題。 兩者均使用.NET Framework 4.6.1在x64版中進行編譯。 我也一直在檢查sizeof()和Marshal.SizeOf()來檢查它們是否具有相同的字節長度。 還嘗試將c ++項目字符從unicode更改為多字節,但沒有成功。
我看到這樣的示例可以很好地解釋所有內容,但是我不知道自己缺少什么: 在C ++ / C#之間的結構內傳遞字符串/數組
C ++程序:
struct myStruct
{
int myInt;
double myDouble;
bool myBool;
char myString[64];
};
int main() {
const TCHAR* pemodule = _T("F:\\PATH\\TO\\DLLsi\\LibCSharp.dll");
HMODULE lib = LoadLibrary(pemodule);
typedef LPCSTR(_cdecl *_string_exchange)(LPCSTR s);
auto pString_exchange = (_string_exchange)GetProcAddress(lib, "_string_exchange");
LPCSTR test = pString_exchange("LPCSTR test works fine");
std::cout << test << std::endl;
typedef myStruct(_cdecl *_return_struct)();
auto pReturn_struct = (_return_struct)GetProcAddress(lib, "_return_struct");
myStruct aStruct = pReturn_struct();
std::cout << aStruct.myString << aStruct.myBool << " " << aStruct.myDouble << " " << aStruct.myInt << std::endl;
return 0;
}
C#庫:
namespace LibCSharp
{
public class Class1
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct myStruct
{
public int myInt;
public double myDouble;
[MarshalAs(UnmanagedType.U1)]
public byte myBool;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string myString;
}
[DllExport]
public static myStruct _return_struct()
{
Console.WriteLine("test");
myStruct a;
a.myInt = 3;
a.myDouble = 2;
a.myBool = 1;
Console.WriteLine(a.myBool);
a.myString = "Hello world! My values are: ";//28
Console.WriteLine(a.myString);
return a;
}
[DllExport]
public static string _string_exchange(string s)
{
Console.WriteLine(s);
return s;
}
}
}
我也希望將來使這個結構成為一個數組,我希望一旦解決就不會遇到很多問題,但是事先提出任何意見也是可以的。
先感謝您
也許您應該嘗試使用命名管道在兩個進程之間進行通信。 它允許您打開流並傳輸任何字節數組。 因此,您可以將任何對象序列化為數組並進行傳輸。
這是C ++和C#通信的有效解決方案 。
與互操作相比,管道更靈活且與系統無關。 但可能效率較低...
乍一看,您的c#代碼似乎在編組,將字符串作為tchar[64]
返回,這幾乎可以肯定是Unicode wchar[64]
; 而您的C ++代碼則期望使用ascii char[64]
。
嘗試將c ++定義更改為
struct myStruct
{
int myInt;
double myDouble;
bool myBool;
TCHAR myString[64];
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.