トラブルシューティング - .NET SDK
項目一覧
「クラスにプロパティがありません」の例外を解決する
「クラスにプロパティがありません。リンクが削除された場合」というメッセージが表示される System.InvalidOperationException
が表示されることがあります。
この例外の 3 つの既知の原因があります。
組織化された Realm オブジェクトはありません。これは、Fundy で問題が発生したためです。 こうした場合、
RealmSchema
は例外をスローします。 これを修正する方法の詳細については、「 Fundy Webhook 例外」を参照してください。リンクは 1 つ以上の RealmObject からプロパティを削除しており、 Realmはそれらのプロパティが存在しないと判断します。これは、 リンク動作
Link all assemblies
[Preserve(AllMembers = true)]
が の場合に発生する可能性があります。 が に設定されているが、クラス宣言で 属性を使用していなかった。リンクは、コード内で明示的に参照した、または[Preserve(AllMembers = true)]
属性でマークされたクラスメンバーのみを保持します。つまり、 邦土にプロパティを永続化し、かつコード内のどこでも参照されていない場合、リンクによってそのプロパティが削除され、スキーマの不一致が発生する可能性があります。モデル名検出を妨げるコード難読化ツールを使用しています。 Realm はクラス名を使用してスキーマを生成するため、コード難読化ツールがこれらのクラス名を非表示にしていると、スキーマ生成は失敗します。 この問題を解決するには、コード難読化ツールを設定して、モデル クラスを無視します。
フォーミュラ:「処理されていない例外が発生しました」
この一般的なビルド失敗は、プロジェクトをすでにビルドし、その後新しいRealmObject
サブクラスを追加した場合に発生します。 プロジェクトで BuildまたはRunを選択しても、Fedy Weaver を呼び出すのに十分なプロジェクトの再ビルドは行われません。 これを修正するには、プロジェクトをRebuildに選択します。
Fortune 例外
クラスが組み合わされていないことに関するビルドログに警告が表示されることがあります。 これは、Fewing パッケージが正しくインストールされていないことを示しています。 以下は、いくつか確認する点です。
まず、
FodyWeavers.xml
ファイルに Realm の エントリが含まれていることを確認します。また、Fundy のインストールが失敗した可能性もあります。 Visual Studio 2015 および NuGet Package Manager のバージョン 3.2 より前のバージョンでこの問題が発生しています。 これを診断するには、テキストエディタを使用して、
.csproj
に次のようなFody.targets
をインポートする行があることを確認します。<Import Project="..\packages\Fody.1.29.3\build\portable-net+sl+win+wpa+wp\Fody.targets" Condition="Exists('..\packages\Fody.1.29.3\build\portable-net+sl+win+wpa+wp\Fody.targets')" />
最も簡単な修正は、NuGet パッケージ マネージャーの新しいバージョンにアップグレードすることです。 これが機能しない場合は、Fedy とMicrosoft.Bcl.Build.targets
に問題が発生する可能性があります。 .csproj から次の行を削除 ファイルは次の役立つ場合があります。
<Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
WriteAsync の問題のトラブルシューティング
WriteAsync()
メソッド内で、null 以外のSynchronizationContext.Current
オブジェクトをチェックして、コードが UI スレッドで実行されるかどうかを判断します。 ワーカー スレッドでCurrent
を設定している場合、このチェックは不正確になる可能性があります。 ワーカー スレッドでSynchronizationContext.Current
を設定している場合は、 WriteAsync()
ではなくWrite()
メソッドを呼び出します。
詳細については、「非同期書込み 」を参照してください。
'AddDefaultTypes' は、Realm インスタンスを作成する前に呼び出す必要があることを解決する
「Realm インスタンスを作成する前に AddDefaultTypes を呼び出す必要があります」というメッセージが表示されるSystem.NotSupportedException
が表示されることがあります。 これは、Realm モデルを含む複数のプロジェクトがあり、すべてがメモリにロードされる前に Realm インスタンスを開いた場合に発生する可能性があります。
原因の説明
.NET はパフォーマンスを向上させるために遅延読み込みを使用します。 組み立ては、それに含まれる型の 1 つ以上が必要になるまでロードされません。 ただし、Realm は モジュール初期化子 に依存します すべての型をデフォルトのスキーマに登録します。Realm を初めて開くと、デフォルト スキーマがロックされ、さらにタイプを登録しようとすると、上記の例外が発生します。
解決法
この問題を解決するには、次の 3 つの方法があります。
Realm モデルは、
Realm.GetInstance
を呼び出す同じ組み立てに配置できます。構築に静的メソッドを作成して、Realm オブジェクトを含む構築を事前に読み込み、アプリ コードからそのメソッドを呼び出すことができます。
// In your models assembly public static class MyAssemblyLoader { public static void LoadMe() {} } // In your app public void Initialize() { MyAssemblyLoader.LoadMe(); } Realm を初期化するときに、Realm スキーマを明示的に指定できます。
var config = new RealmConfiguration { Schema = new[] { typeof(Person), typeof(Company), ... } }
iOS/IP OS が無効な割り当て/メモリが不足しています
使用可能なメモリがほとんどない iOS または IP デバイス、または複数の Realm や多数の通知を使用するメモリ集中型のアプリケーションでは、次のエラーが発生する可能性があります。
libc++abi: terminating due to an uncaught exception of type std::bad_alloc: std::bad_alloc
このエラーは通常、十分なメモリが利用できないため、リソースを割り当てることができないことを示します。
iOS15 + または iOS15 + 用にビルドしている場合は、 拡張仮想アドレス指定権限 を追加できます この問題を解決するには、 を使用します。
これらのキーをプロパティ リストに追加し、値をtrue
に設定します。
<key>com.apple.developer.kernel.extended-virtual-addressing</key> <true/> <key>com.apple.developer.kernel.increased-memory-limit</key> <true/>