1

我必须将我的 C# 应用程序中的 InParameter 传递给 VC++ DLL 中的导出函数。该函数接受 2 个参数:

int func_name (FILE* fp, BYTE& by);

fpis In 和byis Out 参数。

我正在考虑编组使用IntPtrforFILE*和使用 byte for BYTE。这是正确的吗?如果我用 C# 编写以下内容

[DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int      func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);

它会起作用吗?我认为它会给编组语句中的“&”符号带来错误。如何通过引用传递 out 参数?

您的帮助将不胜感激。

谢谢,维伦

4

2 回答 2

2

不,这不会像写的那样工作。

  1. 你将在哪里获得FILE*一个 C# 程序?除非您的非托管 dll 中的某些其他函数为您提供此指针,否则您就有麻烦了。顺便说一句,我强烈建议将其包装FILE*SafeHandle; 那么您的 p/invoke 签名将使用 aSafeFilePointer而不是裸IntPtr.
  2. 你要编组多少字节?如果只有一个,则放入out byte by托管签名(不需要属性)。
  3. 您不需要指定字符集,因为您没有编组任何chars 或strings。
于 2009-07-31T14:11:10.257 回答
1

如果本机函数需要引用,您可以使用它 ref/out 对其进行编组。所以在你的情况下,你可以使用: out byte by。我已经检查过了,它对我有用。

再次编辑:我刚想到,我给你的建议是行不通的,因为 FILE 是一个结构,你不能那么容易地从 c# 编组。因此,从头开始,如果您将 SafeFileHandle 威胁为非托管库中的 HANDLE 对象,则可以使用此方法。如果您无法修改此 dll,一种解决方案是创建自己的包装器以使用 stdio 创建文件,它可能如下所示:

  1. 创建公开 fopen、fclose 等功能的库。 Fe。(在 C++ 中):
    FILE* CreateFile(char* name);
  2. Marhall 这个函数,在这个例子中你将使用 (c#):
    公共静态外部 IntPtr CreateMyFile([MarshalAs(UnmanagedType.LPStr)] 字符串名称);
  3. 将所有 FILE* 参数编组到 IntPtr,然后将函数的结果 CreateMyFile作为 FILE* 传递。
于 2009-07-31T14:21:09.660 回答