-1

ここに私のC#メインがあります

class Program
{
    static void Main(string[] args)
    {
        int i;
        unsafe
        {
        hdf_call_vars_t ret_vals;

        //IntPtr a ;
        //Marshal.PtrToStructure(a,ret_vals);

        ret_vals.fetch_nav = 1;
        string str = "C:\\DoAT\\a.h5";
        byte[] bytes = Encoding.ASCII.GetBytes(str);

            fixed (byte* p = bytes)
            {
                sbyte* sp = (sbyte*)p;
                //SP is now what you want
                DoAT.atrClass1 cl = new DoAT.atrClass1();

                cl.read_hdf5_file(sp,  ret_vals);

C#の構造体はどこですか

[StructLayout(LayoutKind.Sequential, Pack = 1)]
/* Returned values from read_hdf5_file */
unsafe struct hdf_call_vars_t {
    public channel_vars p_vars; 
    public channel_vars s_vars; 
    FILE_VERSION file_vers; /* Set in top level sub. used in lower */
    public int fetch_nav; /* Boolean flag */
    public s_line_header_t * n_addr; /* malloc'd address of n data */
    public UInt32 n_lines;
    csdt_file_header_t hdr; 
};

これはコンパイルされません。「cl」は入力として hdf_call_vars_t へのポインターが必要です。

私のC ++マネージDLLには

int atrClass1::read_hdf5_file
    (const char * file_path, /* Path to  file */
     hdf_call_vars_t & ret_vals)

そしてまた

struct hdf_call_vars {
    struct channel_vars p_vars; 
    struct channel_vars s_vars; 
    enum FILE_VERSION file_vers; /* Set in top level sub. used in lower */
    int fetch_n;     
    s_line_header_t * n_addr; /* malloc'd address of  data */
    unsigned int n_lines;
    csdt_file_header_t hdr; 
};
typedef struct hdf_call_vars hdf_call_vars_t;

なぜC#はポインターをC++に送信する必要があると考えるのですか? だとしたら、C#の世界で構造体のポインタを作るにはどうすればいいのでしょうか?

4

1 に答える 1

0

C++ DLL が管理されている場合、atrClass1 を管理対象としてマークし、P/Invoke の混乱をすべて回避してみませんか?

public ref class atrClass1
{
public:
    int read_hdf5_file(String^ file_path, hdf_call_vars^% ret_vals)
    {
        ...
    }
};

その後、C# から直接使用できます。

もちろん、管理されたバージョンの hdf_call_vars も必要です。また、コードをよりオブジェクト指向にする必要があります (現在の hdf_call_vars のような POD タイプは避けてください)。

于 2013-02-14T03:51:15.277 に答える