从C#编组到C++;

从C#编组到C++;,c#,c++,marshalling,C#,C++,Marshalling,我必须将C#应用程序中的输入参数传递给VC++DLL中导出的函数。该函数接受2个参数: int func_name (FILE* fp, BYTE& by); fp为输入,by为输出参数 我正在考虑对文件*使用IntPtr进行封送,并对字节使用byte。对吗?如果我用C写以下内容# 行吗?我认为它会给封送处理语句中的“&”符号带来错误。如何通过引用传递参数 非常感谢你的帮助 谢谢,维伦不,这不会像写的那样起作用 在C#程序中,您将在哪里获得文件*?除非非托管dll中的其他函数提供此指针

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

int func_name (FILE* fp, BYTE& by);
fp
为输入,
by
为输出参数

我正在考虑对
文件*
使用
IntPtr
进行封送,并对
字节
使用byte。对吗?如果我用C写以下内容#

行吗?我认为它会给封送处理语句中的“&”符号带来错误。如何通过引用传递参数

非常感谢你的帮助


谢谢,维伦不,这不会像写的那样起作用

  • 在C#程序中,您将在哪里获得
    文件*
    ?除非非托管dll中的其他函数提供此指针,否则您会遇到麻烦。顺便说一句,我强烈建议将这个
    文件*
    包装成;然后您的p/invoke签名将使用
    SafeFilePointer
    而不是裸
    IntPtr
  • 您正在封送多少字节?如果只有一个,则在托管签名中按输出字节(不需要属性)
  • 您不需要指定字符集,因为您没有封送任何
    char
    s或
    string
    s

  • 若本机函数需要引用,则可以使用it ref/out封送它。因此,在您的情况下,您可以使用:
    out byte by
    。我检查过了,它对我有效

    再次编辑:我突然想到,我给你的建议是行不通的,因为文件是一个结构,你不能那么容易地从c#整理。因此,如果要将SafeFileHandle作为非托管库中的句柄对象,可以使用这种方法。如果无法修改此dll,一种解决方案是创建自己的包装器,以便使用stdio创建文件,它可能如下所示:

  • 创建公开fopen、fclose等功能的库。(在c++中): 文件*创建文件(字符*名称)
  • Marhall此函数,在本例中,您将使用(c#): 公共静态外部IntPtr CreateMyFile([Marshallas(UnmanagedType.LPStr)]字符串名)
  • 将所有文件*参数打包到IntPtr,然后将函数
    CreateMyFile
    的结果作为文件*传递

  • 我只封送1个字节。因此,请您为要封送的文件*建议一条语句。我是.NET编程新手,不知道如何用SafeHandle包装文件*。谢谢,我重复一遍-你从哪里得到的文件*?你需要打开一个文件,或者什么?我在我的C语言应用程序中导入的C++ DLL中导出了int函数名(文件*FP,字节和by)。在我的C#应用程序中,我输入打开一个二进制文件并将句柄传递给导入的函数。我还不知道如何在C#中获得句柄。我假设我们可以在C语言中打开二进制文件,就像我们在C++中使用文件*fp=“tffOpt”(路径,模式)一样,它的句柄也不能这样做。您的非托管函数想要的<>代码>文件>代码>属于与您的非托管DLL链接的C++运行库,它不一定与链接到CLR的C++运行库相同。而且无论如何.NET在内部不使用
    文件*
    ,而是在本机
    句柄
    上构建I/O。您可以控制非托管dll的源吗?我可以访问它,但它是只读访问。我不允许修改它,也不打算修改它,因为它是在现场(生产)系统上。谢谢Ravadre。但我仍然坚持使用文件类型编组。你能给我一个同样的建议吗:我应该使用4字节无符号整数吗?我现在没有要测试的代码。我会很快得到它,并会尽快在这里更新。。现在我想到的是:DllImport(“name_of_project.dll”,CharSet=CharSet.Ansi)]公共静态外部函数名(U4 FilePointer,out byte by);UF,抱歉所有这些编辑,我检查了这个解决方案,它工作得很好。一个点:确保两个非托管DLL链接到同一个C++运行时DLL,或者到静态C++运行库的同一版本。
    [DllImport("name_of_project.dll", CharSet = CharSet.Ansi)] public static extern int      func_name(IntPtr FilePointer, [MarshalAs(UnmanagedType.BYTE&)] byte by);
    
    FILE* CreateFile(char* name); public static extern IntPtr CreateMyFile([MarshalAs( UnmanagedType.LPStr)] string name);