我需要在我的应用程序中使用本机dll结构。在DLL .h文件中 结构da_i2k_input_file_info是如何将C#string []转换为System.IntPtr?
struct DA_I2K_EXPORT_API da_i2k_input_file_info {
const WDCHAR * image_path;
const WDCHAR ** image_files;
int num_images;
};
,这是可能看起来用户代码,如果用C++编写
in_file_info.num_images = 3;
in_file_info.image_files = new const WDCHAR*[in_file_info.num_images];
in_file_info.image_files[0] = WSTR("IMG_8670.JPG");
in_file_info.image_files[1] = WSTR("IMG_8671.JPG");
in_file_info.image_files[2] = WSTR("IMG_8672.JPG");
喜欢,但此C#代码
[StructLayout(LayoutKind.Sequential)]
public struct da_i2k_input_file_info
{
[MarshalAs(UnmanagedType.LPTStr)]
public string image_path;
public IntPtr image_files;
public int num_images;
}
var openFileDialog = new OpenFileDialog{Multiselect = true};
da_i2k_input_file_info in_file_info;
in_file_info.image_path = null; // use full path in .image_files
in_file_info.num_images = openFileDialog.FileNames.Length;
in_file_info.image_files = openFileDialog.FileNames;
导致此错误
C注释隐式地将类型'string []'转换为'System.IntPtr'
作为IntPtr铸造openFileDialog.FileNames没有帮助。 如何从openFileDialog.FileNames加载in_file_info.image_files?
它不会建立与运行过程中的变化,但休息。改变'公共的IntPtr image_files'到'[的MarshalAs(UnmanagedType.LPArray)]公共串[] image_files'导致'System.TypeLoadException:不可以键入 'da_i2k_input_file_info' 的编组场 'image_files':无效的托管/非托管类型组合(数组字段必须与ByValArray或成对的SafeArray)'。我也试图改变LPArray到ByValArray和安全数组但也不能工作。我相信image_files需要有一个IntPtr。 – jacknad 2012-01-12 20:48:56