【发布时间】:2012-11-09 17:08:41
【问题描述】:
我收到一个 ArgumentException “对象类型无法转换为目标类型”,但这对我来说意义不大。
我正在调用的方法具有以下签名:
public void Scan(IProgressStatus monitor, string registryPath, string startupDir, string addinsDir, string databaseDir, string scanFolder, string[] filesToIgnore)
我尝试传递 monitor 而不是 remMonitor 但仍然抛出异常。
除了 scanFolder 为 null(但传递 string.Empty 仍然抛出异常)和 filesToIgnore 是一个零长度数组之外,所有参数都有值。
我不知道为什么会抛出异常。
不知道它是否有帮助,但该进程是 64 位的。如果我从 32 位进程调用相同的方法,则不会引发异常并且运行良好。
[EDIT]如果我传递 null 而不是 remMonitor,它将进入方法。
[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'
看起来那个监视器实际上有一个不兼容的类型,现在问题是为什么?
[EDIT3] 好的,我已经理解这是一个 DllHell 加载上下文问题,我已经打开了 Visual Studio 中的所有异常,它说 Mono.Addins 是在一个LoadFrom 上下文。但是,如果我编写指令Assembly.Load("Mono.Addins");,则会引发相同的警告(从 LoadFrom 上下文加载)。一些提示?
【问题讨论】:
-
我猜问题出在 Scan 方法内部。是你自己写的方法吗?这可能是由于一些反射错误
-
如果我按下“step into”,异常会在它进入方法体之前被抛出,所以我认为问题出在参数类型的某个地方。方法不是我自己写的,这是mono.addins源码:monoaddins.codeplex.com/releases/view/96359
-
你试过查看异常的 StackTrace 吗?
-
这是堆栈跟踪:在 Mono.Addins.Database.RemoteSetupDomain.Scan(IProgressStatus monitor, String registryPath, String startupDir, String addinsDir, String databaseDir, String scanFolder, String[] filesToIgnore) 在 Mono .Addins.Database.SetupDomain.Scan(IProgressStatus monitor, AddinRegistry registry, String scanFolder, String[] filesToIgnore) 在 d:\Desktop\Mono.Addins-source-1.0\Mono.Addins\Mono.Addins.Database\SetupDomain.cs :第 44 行
-
抱歉我不知道怎么格式化
标签: c# visual-studio-2010 exception 64-bit autocad