我有一个包装器库,它使用调用非托管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);
}
我该怎么做?
提前致谢
答案 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无法使指针无效。