2013-02-14 2 views
-1

Вот мой C# главныйвызова управляемого C++ функции DLL из 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); 

где структура в С #

[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; 
}; 

это не компилируется, говорит 'сл' необходим в качестве входных данных указатель к 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#?

+0

См. IntPtr http://msdn.microsoft.com/en-us/library/system.intptr(v=VS.100).aspx#Y69 – allen

+0

Ваш код на C++ говорит & ret_vals, что означает, что вы должны передать свою структуру по ссылке – jszigeti

+0

спасибо, Аллен и jszigeti. Я попробовал –

ответ

0

Если ваша C++ DLL управляется, почему бы вам не просто пометить atrClass1 как управляемый и избежать всего беспорядка P/Invoke?

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

Тогда вы можете использовать это непосредственно с C#.

Из couse вам также нужна управляемая версия hdf_call_vars. Вы также должны сделать код более объектно-ориентированным (избегайте типов POD, таких как hdf_call_vars).

+0

Благодарим за отзыв. Я не знаком с управляемым кодом и не уверен, что пытаюсь его закрыть. Я думаю, мне придется попробовать маршрут intptr, который тоже я не знаком. Спасибо за помощь. –