.NET中的固定字段非常特殊。你有一個固定的字段(public fixed byte foo[10]
)被編譯成一個特殊的嵌套結構,並且你的固定字段的類型被改變成該嵌套結構。總之,這樣的:
public fixed byte foo[10];
被編譯成這樣:
// This is the struct that was generated, it contains a field with the
// first element of your fixed array
[CompilerGenerated, UnsafeValueType]
[StructLayout(LayoutKind.Sequential, Size = 10)]
public struct <foo>e__FixedBuffer0
{
public byte FixedElementField;
}
// This is your original field with the new type
[FixedBuffer(typeof(byte), 10)]
public <foo>e__FixedBuffer0 foo;
你可以像ILSpy工具看到自己這一點。現在
,如果在C#代碼具有線GetString(obj.foo)
它被編譯成:
GetString(&obj.foo.FixedElementField);
所以它的字面需要你的數組的第一個元件的地址,並將其作爲所述參數的方法(因此GetString
參數是正確的類型,byte*
)。
當您在IronPython中使用相同的參數調用相同的方法時,參數類型仍然是您的字段的類型:<foo>e__FixedBuffer0
,無法轉換爲byte*
(顯然)。調用此方法的正確方法是執行與C#編譯器相同的替換 - 將FixedElementField
的地址傳遞給GetString
,但不幸的是,Python(據我所知)沒有類似於在C#中使用&
運算符。
結論是:您無法直接從IronPython訪問固定字段。我要說的是你最好的選擇是有一個「代理」的方法,如:
public string GetFooString(Baz baz)
{
return new string((sbyte*)baz.foo);
}
PS我不是IronPython的親,所以也許有一個超級的方式來直接訪問foo的支柱,但我只是看不到如何。
什麼是cchar?我無法找到它應該是什麼的參考。還是你的意思是char? – 2012-04-12 15:19:58
cchar是字節,他忘記了用cchar = System.Byte;在問題中。 用公共固定字節foo代替他的公共固定cchar foo [10] [10] – Joe 2012-04-12 19:58:43
我改變了使用'byte'的問題。 – 2012-04-12 21:26:40