是否有一种通过使用结构将字符串从C ++发送到C#的方法?我有一个带有图像数据(数据和大小)的结构,在这个结构中,我也想从图像中获取条形码数据。我试图通过C#中的IntPtr来做到这一点,但是那会返回乱码并通过Stringbuilder来实现,但此结构无法编组。请参阅下面的所有相关代码
C#结构
public struct ImageInfo
{
public IntPtr data; // image data, works
public int size; // image data, works
// string
//public IntPtr barcodeType; // return gibberish
//public IntPtr barcodeData; // return gibberish
public StringBuilder barcodeType; //Cannot marshal field 'barcodeType' of type 'ImageProcessingOpenCv.ImageInfo'
public StringBuilder barcodeData; //Cannot marshal field 'barcodeData' of type 'ImageProcessingOpenCv.ImageInfo'
}
C#导入:
[DllImport("AlgorithmsCpp.dll", EntryPoint = "ScanBarcode", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void ScanBarcode(byte[] data, int dataLen, ref ImageInfo imTemplate);
C ++调用以及我如何尝试从IntPtr获取字符串:
ImageInfo imInfo = new ImageInfo();
AlgorithmCpp.ScanBarcode(sourceImagePixels, sourceImagePixels.Length, ref imInfo); // wont work with StringBuilder.
string stringa = Marshal.PtrToStringAnsi(imInfo.barcodeType); // result: gibberish
stringa = Marshal.PtrToStringAuto(imInfo.barcodeType); // result: gibberish
stringa = Marshal.PtrToStringBSTR(imInfo.barcodeType); // result: gibberish
stringa = Marshal.PtrToStringUni(imInfo.barcodeType); // result: gibberish
stringa = Marshal.PtrToStringUTF8(imInfo.barcodeType); // result: gibberish
// example what is returned: "\0\0\0\0\0\0\0\0\f\0\0\0"
C ++结构:
struct ImageInfo
{
unsigned char* data;
int size;
// String
//unsigned char* barcodeType; // for IntPtr, return gibberish
//unsigned char* barcodeData; // for IntPtr, return gibberish
char* barcodeType; // for StringBuilder
char* barcodeData; // for StringBuilder
};
我如何尝试从C ++返回字符串
#define DllExport extern "C" __declspec(dllexport)
DllExport void ScanBarcode(unsigned char* data, int dataLen, ImageInfo& imInfo)
{
// do stuff to get barcode
// for IntPtr
std::string type = symbol->get_type_name();
std::string data = symbol->get_data();
imInfo.barcodeType = (unsigned char*)type.c_str();
imInfo.barcodeData = (unsigned char*)data.c_str();
// For StringBuilder
strcpy(imInfo.barcodeData, symbol->get_data().c_str());
strcpy(imInfo.barcodeType, symbol->get_type_name().c_str());
}
我希望上面的代码能使您了解我尝试过的东西和想要拥有的东西。如果您需要任何其他信息,请告诉我,我将尝试提供。
StringBuilder是不是字符串。
将您的结构更改为:
public struct ImageInfo
{
public IntPtr data; // image data, works
public int size; // image data, works
// string
//public IntPtr barcodeType; // return gibberish
//public IntPtr barcodeData; // return gibberish
public string barcodeType;
public string barcodeData;
}
应该起作用,因为编译器现在具有一个已知值(某种)类型,它可以传递给您的C ++结构。StringBuilder无法正常工作,因为这是一个不能转换为字符串的对象,相反,编译器必须知道调用.ToString()方法。