4

「Assembly.LoadFile」でロードされた .NET dll のブレークポイントを配置して変数を調べることはできますが、何らかの理由でジェネリック リストのビジュアライザーに要素が表示されません (以下を参照)。変数の上にカーソルを置いたときと同じことがウォッチ ウィンドウに表示されます。

私はこれらのさまざまなソリューションを調べましたが、どれも機能していないようです (また、ほとんどの場合、dll をデバッグすることさえできないようです):

動的に読み込まれたアセンブリをデバッグする

Visual Studio .NET で動的に読み込まれたアセンブリをデバッグする

pdbをdllと並べて配置しました(ロード元の正確な場所から)。また、その dll の pdb ファイルを、読み込みを行っていた実行可能ファイルのすぐ隣に配置しましたが、サイコロはまだありません。デバッグでコンパイルしており、すべての構成を x86 に設定しています。注意すべきことの 1 つは、実際に dll を参照として追加すると、デバッグ ビジュアライザーが完全に表示されます (ただし、これはプラグイン アーキテクチャであり、exe は dll に依存する必要はありません)。

何か案は?

[編集]

プラグインを参照として追加することはできないことがわかりました.exeでそのタイプのリストを実際にインスタンス化してから、正しく表示する必要があります。何が起こっているのかわかりません...

[編集]

この動作を示すサンプル プロジェクトを作成しました。プラグインをロードする方法と同様のコードを使用しました (興味深いことに、Assembly.LoadFile を直接呼び出し、リフレクションを介してメソッドを呼び出すだけでは、この動作は発生しないようです。サンプル プロジェクトをここに圧縮しました: (他の誰かが同じ結果?)

http://dl.dropbox.com/u/64502227/PluginLoader.zip

[編集]

また面白い展開!exe の横に Plugins フォルダがあり、そこにすべての dll があります。現在、プラグイン dll/pdb を exe ディレクトリと Plugins サブディレクトリの両方にコピーしています。Assembly.LoadFile を使用し、Plugins ディレクトリで dll を使用すると、独自の型のリスト ビジュアライザーが失われます。exeのすぐ隣にdllをロードすると動作しますが、なぜですか?

私が見るもの:

ここに画像の説明を入力

4

3 に答える 3

1

解決策A:

  • 独自のディレクトリではなく、exeディレクトリからすべてのdllをロードします。

解決策B:

これを使用してプラグインを作成します。

Plugin plugin = (Plugin)Activator.CreateInstance(assembly.FullName, "SamplePlugin.MyPlugin").Unwrap();

これの代わりに:

Plugin plugin = (Plugin)Activator.CreateInstance(assembly.GetType("SamplePlugin.MyPlugin"));

コードの2行目は、実際にはコードの1行目によって内部的に呼び出されると思います(たとえば、最初の行はアセンブリを名前で検索し、その中から「SamplePlugin.MyPlugin」タイプを見つける必要があります。 Unwrap()して返します)が、明らかにそうではありません。

残念ながら、これは問題の解決策ですが、なぜそれが発生するのかについては答えられません。誰かが知っているなら、私はまだ情報を大いに感謝します。

于 2012-04-28T22:00:48.097 に答える
0

VS オプションの 1 つを確認します: [ツール] --> [オプション] --> [デバッグ] --> [全般] を選択し、下にスクロールして、[変数ウィンドウにオブジェクトの生の構造を表示する] がオフになっていることを確認します。

于 2012-04-28T11:11:06.037 に答える
0

いつでも即時ウィンドウを使用して、次のことを行うことができます。

string.Join("\r\n", roots);

または、インデックスを含めるための長いバージョン:

string.Join("\r\n", items.Select((index, item) =>
                string.Format("{0}: {1}", index, item)));

または、まさにそれを行うグローバル関数を用意して、次のように使用するとよりきれいになります。

Print(roots);

と:

public static void Print<T>(IEnumerable<T> items)
{
    Debug.WriteLine(string.Join("\r\n", items.Select((index, item) =>
                        string.Format("{0}: {1}", index, item))));
}
于 2012-04-28T03:06:24.617 に答える