У меня есть DLL, из которой мне нужно P / Invoke следующий метод C:
int DAOpen(HANDLE *hOpen, UNIT *flags, void *callback, char *userData)
Я придумал следующую подпись C #:
[DllImportAttribute("<libName>", EntryPoint="DAOpen")]
static extern int DAOpen(
out IntPtr hOpen,
ref uint flags,
IntPtr callback,
IntPtr userData);
Предполагая, что собственный код сохраняет ссылку на все параметры дольше, чем продолжительность вызова P / Invoke:
Помимо хранения экземпляра hOpen
, я должен также прикрепить его?
Должен ли я сохранить ссылку на переменную flags
? Должен ли я также прикрепить его, поскольку он передается в качестве ссылки в данном конкретном случае?
Я назначаю своего callback
делегата следующим образом:
private IntPtr callBackOnNativeEvents;
...
this.callBackOnNativeEvents = Marshal.GetFunctionPointerForDelegate(
new CallBack(this.CallBackOnNativeEvents));
Должен ли я хранить ссылку на делегат внутри себя (не только указатель)? Должен ли я также прикрепить его?
Наконец, я определяю параметр userData
следующим образом:
private IntPtr userData;
...
string userName = "test";
this.userData = Marshal.StringToHGlobalAnsi(userName);
Должен ли я сохранить ссылку на строку? Должен ли я также закрепить это? В документации API говорится, что он копирует содержимое строки в неуправляемую память, но я не уверен, копирует ли он содержимое ссылки.