.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
に渡しますが、残念ながら、Pythonには(私の知る限り)の演算子にGetString
類似したものがありません&
C#。
結論は次のようになります。IronPythonから固定フィールドに直接アクセスすることはできません。私はあなたの最善の策は次のような「プロキシ」メソッドを持つことだと思います:
public string GetFooString(Baz baz)
{
return new string((sbyte*)baz.foo);
}
PS私はIronPythonプロではないので、fooプロップに直接アクセスするためのスーパーウェイがあるかもしれませんが、その方法がわかりません。