Dll导入如何通过引用获取单个值

本文关键字:获取 单个值 引用 何通过 导入 Dll | 更新日期: 2023-09-27 18:30:50

能够

使用指针参数获取输出参数的适当签名/马歇尔属性是什么?到目前为止,我尝试了这个:

// 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)

前面的方法不会将值从 C 弹出到 .NET。我还尝试使用带有IntPtr签名的固定GCHandle。

[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 值?

Dll导入如何通过引用获取单个值

这对我有用(因为它应该):

//C++ DLL (__stdcall calling convention)
extern "C" __declspec(dllexport) void Foo(double *result) {
    *result = 1.2;
}
//C#    
class Program
{
    [DllImport( "Snadbox.dll", CallingConvention=CallingConvention.StdCall )]
    static extern void Foo( ref double output );
    static void Main( string[] args )
    {
        double d = 0;           
        Foo( ref d );
        Console.WriteLine( d ); // prints "1.2"         
    }
}

使用 ref 关键字传递double就足够了。 因此,我被引导相信在实现中存在错误(或误解)。 你能为我们发布实施吗?

另外,也许您正在使用默认调用约定 (cdecl) 构建 C++ 版本,但 .NET 使用的是 StdCall 。 你确定这些排队了吗? 如果它们混合,您可能会崩溃,但无法保证。 例如,在我的示例中,如果我将C++端更改为 cdecl则 out 参数将读回为 0。