Я должен вызвать C ++ DLL в C #.И заголовок dll выглядит следующим образом (упрощенно):
// Заголовок C ++
struct vector
{
float x;
float y;
vector()
{}
vector(float x0, float y0)
{
x = x0;
y = y0;
}
};
struct unmanaged_struct
{
int int_var;
float float_var;
char* chars_var;
vector vector_var;
unmanaged_struct(int i, float f, char* ch, float vec_x, float vec_y)
{
int_var = i;
float_var = f;
chars_var = ch;
vector_var = vector(vec_x, vec_y);
}
};
// эта функция используется для вывода всех значений переменных экземпляра структуры
extern "C" __declspec( dllexport ) void unmanagedstruct_summary(unmanaged_struct* us_list, int length);
И я определил следующий класс в C #
// CSharp
[StructLayout(LayoutKind.Sequential)]
public class Vector
{
public float x;
public float y;
public Vector(float f1, float f2)
{
x = f1;
y = f2;
}
}
[StructLayout(LayoutKind.Sequential)]
public class UnmanagedStruct
{
public int int_var;
public float float_var;
public string char_var;
public Vector vector_var;
public UnmanagedStruct(int i, float f, string s, Vector vec)
{
this.int_var = i;
this.float_var = f;
this.char_var = s;
this.vector_var = vec;
}
}
class UnmanagedDllCallTest
{
[DllImport("unmanageddll.dll", EntryPoint = "unmanagedstruct_summary")]
public static extern void unmanagedstruct_summary([Out]UnmanagedStruct[] usList, int length);
static void Main(string[] args)
{
UnmanagedStruct[] usList = new UnmanagedStruct[1];
usList[0] = new UnmanagedStruct(1, 1.0f, "aa", new Vector(10, 1));
usList[1] = new UnmanagedStruct(2, 2.0f, "ba", new Vector(20, 2));
UnmanagedDllCallTest.unmanagedstruct_summary(usList, 2);
}
И вывод будет следующим:
unmanaged_structсводка:
0
1.12104e-044
Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.в callunmanageddll.UnmanagedDllCallTest.unmanagedstruct_summary (UnmanagedStr uct [] usList, длина Int32) в callunmanageddll.Program.Main (аргументы String []) в c: \ users \ dynaturtle \ documentme nts \ visual studio 2010 \ Projects \ callunmanageddll \ callunman.cs: lin e 68
C ++ dll в порядке, так как я написал тест на C ++, и функция работает хорошо.Я прочитал эту ветку , но, похоже, решение не сработало в моем случае.Какие-либо предложения?Заранее спасибо!