У меня есть следующий код:
namespace WPFMuskTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
[DllImport
("myDll.DLL",
EntryPoint = "?Func1@FUllNameCopiedFromDependancyWalker",
CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl
)
]
public static extern System.IntPtr Func1(out System.IntPtr handle, int type, out DateTime date);
public MainWindow()
{
InitializeComponent();
//
//
//
}
private void button1_Click(object sender, RoutedEventArgs e)
{
System.IntPtr MainParam;
int thetype = 1
DateTime date;
System.IntPtr res = GetFxIRMoveForDate(out MainParam, thetype _til, out date);
}
}
}
EXE находится в том же пути, что и вызываемая DLL, и функция определенно существует в DLL (проверено в DependacyWalker), но я продолжаю получать ошибку:
Вызываемый прототип функции:
класс __declspec (dllexport) OUR_DATE_TYPE
{
….
}
typedef unsigned long TYPE;
typedef DATE_TYPE OUR_DATE_TYPE;
namespace1
{
namespace2
{
void func1(MyClass &myclass, const TYPE& type, const DATE_TYPE& date);
}
}
Необработанное исключение типа ‘System.AccessViolationException’
Кто-нибудь может сказать мне, почему?
По умолчанию C ++ не использует cdecl
Соглашение о вызовах, он использует stdcall
, Вы, вероятно, добились бы большего успеха, написав обертку c для API C ++ и вызвав ее вместо этого, потому что C имеет четко определенный ABI.
РЕДАКТИРОВАТЬ: глядя на ваш код снова, я сомневаюсь DateTime
совпадает с типом даты, который вы используете в C ++. Если это неправильный размер, например, эта ошибка может произойти.
Других решений пока нет …