Каков подходящий атрибут signature/marshall для получения выходных параметров с помощью указателей params? До сих пор я попытался это:DllImport Как получить одиночные значения по ссылке
// Function to calculate the norm of vector. !0 on error.
// int err_NormVec(int size, double * vector, double * norm)
[DllImport("vectors.dll")]
int err_NormVec(int size, double[] vector, ref double norm)
предыдущий подход не выскакивает обратно значение для .NET от C. Я также попытался использовать возлагали GCHandle, с подписью IntPtr.
[DllImport("vectors.dll")]
int err_NormVec(int size, double[] vector, IntPtr norm)
public void doSomething()
{
double norm = 0;
// ...
GCHandle handle = GCHandle.Alloc(norm, GCHandleType.Pinned);
int status = err_NormVec(vector.Lenght, vector, handle.AddrOfPinnedObject());
// ... clean gchandle, check status and so on
}
В этом случае я получил значение обратно, но на GCHandle.Target, а не на исходной норме. Это раздражает. Я хотел бы иметь возможность привязать intptr нормы к себе, а не только к копии.
Что такое подходящая подпись для возврата значения с помощью указателя? Есть ли поддерживаемый способ получить IntPtr для значения int?
Я забыл упомянуть, что использую win64. Который раскрыл некоторые плохие практики, которые используют, чтобы успешно работать в win32-приложениях. – fprades
Покажите нам реализацию (или, по крайней мере, подпись) 'err_NormVec'. Вам не нужно указывать двойной, чтобы использовать его как параметр out, 'ref' будет достаточным. –
@EdS: Ты слепой? – leppie