1

ArgumentException「オブジェクト型をターゲット型に変換できません」を受け取りましたが、あまり意味がありません。この画像で例外を確認できます

私が呼び出しているメソッドには、次の署名があります。

public void Scan(IProgressStatus monitor, string registryPath, string startupDir, string addinsDir, string databaseDir, string scanFolder, string[] filesToIgnore)

monitor代わりに渡そうとしましremMonitorたが、例外はまだスローされています。scanFoldernull (ただし、string.Empty を渡すと依然として例外がスローされる) でfilesToIgnoreあり、長さがゼロの配列であることを除いて、すべての引数に値があります。

例外がスローされる理由がわかりません。

それが役立つかどうかはわかりませんが、プロセスは64ビットです。32 ビット プロセスから同じメソッドを呼び出すと、例外はスローされず、正常に動作します。

[編集] remMonitor の代わりに null を渡すと、メソッドに入ります。

[EDIT2]さらに深くデバッグしていると、奇妙なことがわかりました。パラメータをボックス化してボックス化解除しようとしました:

rsd.Scan((object)remMonitor, registry.RegistryPath, registry.StartupDirectory, registry.DefaultAddinsFolder, registry.AddinCachePath, scanFolder, filesToIgnore);

public void Scan(object monitor, string registryPath, string startupDir, string addinsDir, string databaseDir, string scanFolder, string[] filesToIgnore)
{
    monitor = (IProgressStatus)monitor;

結果は次のとおりです。

?(IProgressStatus)monitor
Cannot cast 'monitor' (which has an actual type of 'System.Runtime.Remoting.Proxies.__TransparentProxy') to 'Mono.Addins.IProgressStatus'

そのモニターには実際には互換性のないタイプがあるようですが、問題はなぜですか?

[編集 3]わかりました、それが DllHell ロード コンテキストの問題であることを理解できました。Visual Studio 内のすべての例外を有効にしました。Mono.Addins は LoadFrom コンテキストでロードされていると表示されます。しかし、命令を書くと、Assembly.Load("Mono.Addins");(LoadFrom コンテキストからロードされた) 同じ警告がスローされます。いくつかのヒント?

4

2 に答える 2

0

Googleグループでこれを見つけ、同じメソッドで同じ例外について言及しています:

https://groups.google.com/forum/#!msg/mono-addins/f4SzNPtcRIg/ma9EPEzGdagJ

SetupDomain.cs:Scan() には、rsd.Scan (remMonitor, registryPath, startupDir, scanFolder, filesToIgnore); という行があります。

このメソッドにステップインすると、Scan() メソッドに移動するのではなく、null を返す RemoteProgressStatus:InitializeLifetimeService() に移動します。そのメソッドから戻った後、例外がスローされます。

これは既知の問題で、おそらく回避策ですか? ありがとう!

System.ArgumentException が発生しました Message="オブジェクト型をターゲット型に変換できません。" Source="Mono.Addins" StackTrace: Mono.Addins.Database.RemoteSetupDomain.Scan (IProgressStatus モニター、文字列 registryPath、文字列 startupDir、文字列 scanFolder、String[] filesToIgnore) で Mono.Addins.Database.SetupDomain.Scan (IProgressStatus モニター) 、文字列 registryPath、文字列 startupDir、文字列 scanFolder、文字列[] filesToIgnore) C:\Users\Kiel\Projects\Mono.Addins \Mono.Addins\Mono.Addins.Database\SetupDomain.cs:line 43
InnerException:

解決:

AddinManager.Initialize(); を移動しました。および AddinManager.Registry.Update(null); [ClassInitialize] とマークされたメソッドに対して、コンストラクターでこれを実行しようとすると、物事は再び幸せになります。

于 2012-11-21T13:03:54.267 に答える
0

最後に、私は自分の問題を解決することができました:

EDIT3 に書かれているように、ロード コンテキストの問題でした。このブログでは、各メソッドのロード動作について非常によく説明されています。

このヒントに従って、次を使用してアセンブリを手動でロードしました。

        System.Reflection.AssemblyName an = new System.Reflection.AssemblyName();
        an.Name = "Mono.Addins";
        an.Version = new System.Version(1, 0, 0);
        System.Reflection.Assembly.Load(an);

次に、適切なアセンブリをパスMono.Addins.dll内に配置しました (これは私のアプリケーション用です)。もともと私は呼び出しアセンブリの同じパスだと思っていましたが、そうではありませんでした.参考までに、私が使用したアプリケーションベースパスを発見してくださいAutoCAD.exeApplicationBaseApplicationBaseSystem.AppDomain.CurrentDomain.BaseDirectory;

于 2012-11-22T15:12:45.987 に答える