Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取指向C#不可blittable ref结构的指针_C#_.net Core_Interop_Unsafe - Fatal编程技术网

如何获取指向C#不可blittable ref结构的指针

如何获取指向C#不可blittable ref结构的指针,c#,.net-core,interop,unsafe,C#,.net Core,Interop,Unsafe,我试图通过pJoNK将指针“REF Stutt”传递给一些C++代码,以便它可以通过委托回调传递给C(),然后避免返回默认的封送处理,因为结构是非BLITHIT(参见我的另一个问题) 我可以通过使用Unsafe.AsPointer获得一个指向包含不可blittable字段的普通结构的指针。但是,这不会为ref结构编译(CS0306),如下代码所示: public struct NormalStruct { public int value; public string text;

我试图通过pJoNK将指针“REF Stutt”传递给一些C++代码,以便它可以通过委托回调传递给C(),然后避免返回默认的封送处理,因为结构是非BLITHIT(参见我的另一个问题)

我可以通过使用Unsafe.AsPointer获得一个指向包含不可blittable字段的普通结构的指针。但是,这不会为ref结构编译(CS0306),如下代码所示:

public struct NormalStruct
{
    public int value;
    public string text;
}

public ref struct RefStruct
{
    public int value;
    public string text;
}

NormalStruct ns = new NormalStruct() { value = 42 };
RefStruct rs = new RefStruct() { value = 42 };

// This works   
void* nsPtr = Unsafe.AsPointer(ref ns);

// This won't compile with CS0306;
void* rsPtr = Unsafe.AsPointer(ref rs);

是否有办法获取指向ref结构的指针,或者更改类型的默认封送处理

为什么需要ref结构?它们有一系列编译器限制,以确保它们永远不会出现在堆上,并且完全基于堆栈。你只是想避免复制吗?ref结构的选择不是我的。System.Text.Json.Utf8JsonReader作为ref结构实现。我想把一个指针传递给C++。C++实际上不会使用指针,但将指针传递回C++中的回调(在这里它将被转换回REF结构),以便使C++代码能够从.NET JSONRe读器读取。请参阅我的另一个问题以了解更多详细信息。我不认为这可以轻松或可靠地完成,ref structs必须位于堆栈上,即使您可以这样做,也无法保持指向它的指针处于活动状态,您必须在回调处于活动状态且在范围内的位置暂停回调的执行。这里有几个编译器问题。还有概念性的,你最好保留一个对传入的ReadOnlySequence的引用,并以某种方式初始化一个新的Utf8JsonReader。实际上,我也怀疑这是否会有帮助:/在这种情况下,保持指针处于活动状态没有问题,因为所有实际使用指针的代码都位于调用堆栈上指针的下方。我有一个解决方案,它实际上可以将ref与实现回调接口的类一起传递下去——但是,因为运行时坚持通过复制到缓冲区或从缓冲区中复制来封送ref。我目前的工作是使用Newtonsoft JsonReader,它只是一个普通的类,因此不会遇到任何这些问题。