Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无符号字符**在c#中等效,必须在文件中写入返回值_C#_Wrapper_Intptr_Unsigned Char - Fatal编程技术网

无符号字符**在c#中等效,必须在文件中写入返回值

无符号字符**在c#中等效,必须在文件中写入返回值,c#,wrapper,intptr,unsigned-char,C#,Wrapper,Intptr,Unsigned Char,我必须调用win32 dll函数 int func1( int arg1, unsigned char **arg2, int *arg3); 我需要用c#as包装 我在一个c#应用程序中将其称为 int arg1; IntPtr arg2 = IntPtr.Zero; IntPtr arg3 = IntPtr.Zero; func1(arg1,out arg2,out arg3); 在c#包装器中声明的函数以及在c#测试应用程序中调用的函数是否正确? 现在我需要将arg2存储在一个文本文件

我必须调用win32 dll函数

int func1( int arg1, unsigned char **arg2, int *arg3);
我需要用c#as包装

我在一个c#应用程序中将其称为

int arg1;
IntPtr arg2 = IntPtr.Zero;
IntPtr arg3 = IntPtr.Zero;
func1(arg1,out arg2,out arg3);
在c#包装器中声明的函数以及在c#测试应用程序中调用的函数是否正确? 现在我需要将arg2存储在一个文本文件中。如何做到这一点

从汉斯那里得到了答案,我用

System.IO.StreamWriter(@Application.StartupPath + "\\Filename.txt");
file.WriteLine(arg2);
file.Close();

您可能需要使用
marshallas
属性,例如:

public static extern int func1(int arg1, [MarshalAs(UnmanagedType.LPStr)] string arg2, IntPtr arg3);
检查此处以获取文档:

我在dll中有一个清除内存的空闲函数

那你就有机会做到这一点了。函数声明应该如下所示:

[DllImport("foo.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int func1(int arg1, out IntPtr arg2, ref int arg3);
IntPtr ptr = IntPtr.Zero;
int dunno = 99;
string result = null;

int retval = func1(42, out ptr, ref dunno);
if (retval == success) {
    result = Marshal.PtrToStringAnsi(ptr);
    // etc...
}
if (ptr != IntPtr.Zero) func1free(ptr);
你会这样称呼它:

[DllImport("foo.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int func1(int arg1, out IntPtr arg2, ref int arg3);
IntPtr ptr = IntPtr.Zero;
int dunno = 99;
string result = null;

int retval = func1(42, out ptr, ref dunno);
if (retval == success) {
    result = Marshal.PtrToStringAnsi(ptr);
    // etc...
}
if (ptr != IntPtr.Zero) func1free(ptr);

其中“func1free”是释放字符串的未记录函数。

谢谢您的回复。我忘了在第一次提到我在arg2中得到输出值。现在我得到了输出,但是arg2中缺少了一些字节。最后一个参数是
ref int
。您不太可能pinvoke此函数,在使用Marshal.PtrToStringAnsi()转换字符串后,需要释放该字符串。不能,这将泄漏内存。@HansPassant我在dll中有一个空闲函数来清除内存。这是有效的,但第三个参数arg3不是对arg2的引用。arg2和arg3是输出值。arg2是缓冲区值,arg3是缓冲区值的长度。