C#to c ++ / cli to unamanged c ++ ref

时间:2017-03-05 09:21:24

标签: c++ c++-cli

我有一个包装器库,它使用调用非托管c ++的c ++ / cli。 我从c#调用它,并希望作为引用传递一个int数。

public void MethodA()
{
   int result = 0;
   MethodCLI(ref result);
}

public void MethodCLI(int result)
{
    //Singature of the method is
    //  UnmanagedC++(int* result);
    UnmanagedC++(result);
}

我该怎么做?

提前致谢

1 个答案:

答案 0 :(得分:1)

如果需要将值更新传播回C#代码(因此func main() { wg := &sync.WaitGroup{} result := -1 ctx, cancel := context.WithCancel(context.Background()) go func() { defer wg.Done() wg.Add(1) result = RecursiveFunc(ctx, 5, 20) }() time.Sleep(10 * time.Millisecond) cancel() wg.Wait() fmt.Println(result) } 关键字有意义),则必须将C ++ / CLI参数声明为ref。原生C ++中int% result的精确句法等价物。

但是,可能在运行时是“内部指针”。例如,您可以在C#代码中传递类对象的字段。存储在GC堆上,这是一个重要的细节。 GC可能在本机代码运行时运行(例如,由另一个线程触发),并在压缩堆时移动对象。这会使指针无效。 C ++ / CLI编译器不能让这种情况发生,如果你试图将int&直接传递给本机函数,它会大声抱怨。 C ++ / CLI设计者为托管引用选择不同符号的基本原因(result vs ^* vs %)。

需要提供稳定的指针,最简单的方法是将指针传递给未存储在GC堆上的值。像这样:

&

如果您需要传递一个对象而不是一个值,public: void MethodCLI(int% result) { int temp = result; UnmanagedFunction(&temp); result = temp; } 关键字会变得很有用,它会临时锁定传递的对象,因此GC无法使指针无效。