我必须将C#应用程序中的InParameter传递给VC ++ DLL中的导出函数。该函数接受2个参数:
int func_name (FILE* fp, BYTE& by);
fp
为In,by
为Out参数。
我在考虑使用IntPtr
为FILE*
编组并使用BYTE
字节。这是对的吗?如果我在C#中写下以下内容
[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);
它会起作用吗?我认为它会给'&'带来错误签署编组声明。如何通过引用传递out参数?
非常感谢您的帮助。
谢谢,Viren
答案 0 :(得分:2)
不,这不会像写的那样有用。
FILE*
的位置?除非你的非托管dll中的某些其他函数给你这个指针,否则你会遇到麻烦。顺便说一下,我强烈建议将FILE*
包裹在SafeHandle
;那么你的p / invoke签名将使用SafeFilePointer
而不是裸IntPtr
。out byte by
放入托管签名(不需要属性)。char
或string
。答案 1 :(得分:1)
如果本机函数需要引用,您可以使用它ref / out封送它。所以在你的情况下,你可以使用:
out byte by
。我已经检查过了,它对我有用。
再次编辑:我刚刚想到,我给你的建议不起作用,因为FILE是一个结构,你将无法轻易地从c#编组。因此,如果您将SafeFileHandle威胁为非托管库中的HANDLE对象,则可以使用此方法。如果你不能修改这个dll,一个解决方案是使用stdio创建自己的包装器来创建文件,它可能如下所示:
FILE* CreateFile(char* name);
public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);
CreateMyFile
的结果作为FILE *传递。