将C#引用传递给C ++指针并返回

时间:2012-12-20 18:30:17

标签: c# interop pinvoke marshalling dllimport

我想将C#引用传递给C / C ++代码(指针),而不是从指针返回C#引用。 我有很多对(uint,Object)。我用C代码创建了排序机制,因为它比C#快得多。只需要键(uint)和值(对象引用)。 C代码使用键进行排序,而不是更改值(指针)。有没有简单的方法呢?我需要使用编组吗? C函数将被调用多次(甚至可能是一百万次),所以我担心编组太慢了,我甚至不知道如何用编组来完成它。我相信当GC改变对象地址时,C#引用的地址不会改变。因此不需要将对象放在pined内存中。我是对的吗? 现在我可以使用DllImport调用C函数,我能够将C#引用存储到C指针,但是我无法将地址存储在C指针的C#引用中。

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

无法将任何变量直接从manged c#代码传递给本机c ++代码。解决方案是pinvoke,您可以在其中封送数据。

这样可以正常工作,但你应该知道这不是每次都是解决方案。在每次调用时,必须复制内存并根据数据类型进行转换。

答案 1 :(得分:0)

我对类似问题的解决方案,我在Fortan中有一些旧代码。 我将此代码转换为c,然后创建一个托管的c ++项目。 在c#中,我调用了这个manged c ++项目。

c#代码如下所示:

  

不安全
               {
                    double * input =(double *)utils.Memory.Alloc(sizeof(double)* n);
                    double * output =(double *)utils.Memory.Alloc(sizeof(double)* n);
                    //调用c ++代码
                     c_plus_plus.code(输入,输出);                      //现在输出包含输出
                    //(您可以使用相同的数组作为输入和输出
    }

我希望这会有所帮助。