我收到一个 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 位进程调用相同的方法,则不会引发异常并且运行良好。
[编辑]如果我通过 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 上下文加载)。一些提示?