Вот мой 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#?
См. IntPtr http://msdn.microsoft.com/en-us/library/system.intptr(v=VS.100).aspx#Y69 – allen
Ваш код на C++ говорит & ret_vals, что означает, что вы должны передать свою структуру по ссылке – jszigeti
спасибо, Аллен и jszigeti. Я попробовал –