结果结构在C++中定义如下: [DllImport("dds.dll", CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); struct parResults { /* index = 0 is NS view and index = 1 is EW view. By 'view' is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; C++函数的开始 int STDCALL Par(struct ddTableResults * tablep, struct parResults *presp, int vulnerable),c#,c++,struct,pinvoke,dllimport,C#,C++,Struct,Pinvoke,Dllimport" /> 结果结构在C++中定义如下: [DllImport("dds.dll", CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); struct parResults { /* index = 0 is NS view and index = 1 is EW view. By 'view' is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; C++函数的开始 int STDCALL Par(struct ddTableResults * tablep, struct parResults *presp, int vulnerable),c#,c++,struct,pinvoke,dllimport,C#,C++,Struct,Pinvoke,Dllimport" />

C# C++;C中的结构# 我在C++项目中使用DLLIMPART使用C++编写的DLL,我使用的函数之一是: [DllImport("dds.dll", CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); struct parResults { /* index = 0 is NS view and index = 1 is EW view. By 'view' is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; < P>结果结构在C++中定义如下: [DllImport("dds.dll", CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); struct parResults { /* index = 0 is NS view and index = 1 is EW view. By 'view' is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; C++函数的开始 int STDCALL Par(struct ddTableResults * tablep, struct parResults *presp, int vulnerable)

C# C++;C中的结构# 我在C++项目中使用DLLIMPART使用C++编写的DLL,我使用的函数之一是: [DllImport("dds.dll", CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); struct parResults { /* index = 0 is NS view and index = 1 is EW view. By 'view' is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; < P>结果结构在C++中定义如下: [DllImport("dds.dll", CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); struct parResults { /* index = 0 is NS view and index = 1 is EW view. By 'view' is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; C++函数的开始 int STDCALL Par(struct ddTableResults * tablep, struct parResults *presp, int vulnerable),c#,c++,struct,pinvoke,dllimport,C#,C++,Struct,Pinvoke,Dllimport,我应该如何在C#中定义上述结构,以便能够将该结构作为en引用发送到DLL函数中 这是我尝试过的,但根本不起作用,我只是得到一个访问冲突错误 [StructLayout(LayoutKind.Sequential)] public struct parResults { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public char[,] parScore;

我应该如何在C#中定义上述结构,以便能够将该结构作为en引用发送到DLL函数中

这是我尝试过的,但根本不起作用,我只是得到一个访问冲突错误

    [StructLayout(LayoutKind.Sequential)]
    public struct parResults
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        public char[,] parScore;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public char[,] parContractsString;

        public parResults(int x)
        {
            parScore = new char[2,16];
            parContractsString = new char[2,128];
        }
    }

这是一个在C#中封送的相当复杂的结构。有多种方法可以尝试,但我认为将字符数组表示为字节数组并手动封送到字符串和从字符串封送是最干净的。下面是我的意思的演示:

C++

#include <cstring>

struct parResults {
    char          parScore[2][16];
    char          parContractsString[2][128];
};

extern "C"
{
    __declspec(dllexport) void foo(struct parResults *res)
    {
        strcpy(res->parScore[0], res->parContractsString[0]);
        strcpy(res->parScore[1], res->parContractsString[1]);
    }
}

这里我使用了一个类来表示结构。由于C#中的类是引用,因此我们不使用
ref
声明该类型的参数。为了方便起见,我还使用了
\uu cdecl
,以避免计算函数的修饰名称。但是您的库使用了
\uu stdcall
,因此您需要坚持这一点


该类演示了双向发送数据。如果数据流更受限制,您可能会简化代码。

我认为,首先您应该发布C++结构的真正定义和导入的函数。你发布的结构的假版本让我们想知道编译的代码和你发布的代码还有什么变化。我会看看是否能找到它!那么
struct ddTableResults
呢?如何在C++和C语言中声明。为什么在C#中没有通过ref传递呢?我使用的是一些开放源码,文档是有限的;但是,如果对ddTableResult使用一维数组和ref,我成功地使其工作。数据流是以什么方式流动的?从C#到本机库。还是在另一个方向?或者在两个方向。我并不特别想在一些开源的非现场链接中到处闲逛。我认为这是你应该做的,然后在问题中提供声明。感谢到目前为止的编辑。