4

今日、既存のコードを .net から Xamarin (Mono for Android) に移植しようとしたときに、 [MethodImpl(MethodImplOptions.AggressiveInlining)] が Android 用にコンパイルされないという問題が発生しました。アンドロイド。

コードのすべての行を変更せずにこのコードをコンパイルできるかどうか知りたいですか?

すでに同じ名前の属性を作成しようとしましたが、2 つの列挙型が同じ名前 (曖昧) であるため、コンパイル エラーも発生しました。

私が望むのは、既存の Enum に AggressiveInlining 値を挿入し、それに 0 または同様の値を与えるだけで何も起こらないようにする方法です。

誰かがこの問題で私を助けてくれることを願っています。

敬具、

デベセ

4

1 に答える 1

2

私の知る限り、列挙に値を追加することはできません。型は既にライブラリにコンパイルされています。(基になる型の値を列挙値にキャストすることで、それらを他の値に設定できますが、属性を使用した場合には適用できないと思います)

ディレクティブで更新する必要がある使用場所がたくさんあるため、目的のMethodImplOption値を中央からアクセス可能な定数に移動し、すべてが次を参照するようにすることをお勧めします。

public class MethodImplSetting
{
    public const MethodImplOptions DEFAULT_METHOD_IMPL = MethodImplOptions.AggressiveInlining;
}

[MethodImpl(DEFAULT_METHOD_IMPL)]
public void MyMethod()
{

}

次に、コンパイラディレクティブを適用して、コンパイル時に特別な Android 値に簡単に切り替えることができます。

public class MethodImplSetting
{
    public const MethodImplOptions DEFAULT_METHOD_IMPL =
    #if  __ANDROID__
        MethodImplOptions.NoInlining; //or whatever value you want
    #else
        MethodImplOptions.AggressiveInlining;
    #endif
}

追加のプラットフォームをサポートしたり、テストのためにさまざまなメソッド実装オプションを切り替えたりしたい場合は、簡単に実行できます。

適切な Xamarin Android ディレクティブは、プラットフォーム ダイバージェンス/抽象化/ダイバージェント実装のセクション 3.1.2__ANDROID__のドキュメントにあると思いますが、再確認することをお勧めします。

于 2013-06-11T19:02:26.873 に答える