无意义的参数异常调用方法

时间:2012-11-21 12:36:02

标签: c# visual-studio-2010 exception 64-bit autocad

我收到ArgumentException"对象类型无法转换为目标类型"但它对我来说没有意义。You can see the exception in this image

我呼叫的方法具有以下签名:

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上下文加载)。一些提示?

2 个答案:

答案 0 :(得分:0)

在Google群组中发现了这一点,它在同一方法中提到了相同的例外:

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

  

在SetupDomain.cs中:Scan()有一行显示为:rsd.Scan   (remMonitor,registryPath,startupDir,scanFolder,filesToIgnore);

     

如果我进入这个方法,我不会接受Scan()方法,但是   而是返回RemoteProgressStatus:InitializeLifetimeService()   空值。从该方法返回后,将抛出异常。

     

这是一个已知的问题,也许还有一个解决方法吗?谢谢!

     

System.ArgumentException发生Message =“对象类型不能   转换为目标类型。“Source =”Mono.Addins“StackTrace:          在Mono.Addins.Database.RemoteSetupDomain.Scan(IProgressStatus监视器,String registryPath,String startupDir,String scanFolder,   String [] filesToIgnore)          在Mono.Addins.Database.SetupDomain.Scan(IProgressStatus监视器,String registryPath,String startupDir,String scanFolder,   String [] filesToIgnore)在C:\ Users \ Kiel \ Projects \ Mono.Addins中   \ Mono.Addins \ Mono.Addins.Database \ SetupDomain.cs:第43行   的InnerException:

     

解决方案:

     

我移动了AddinManager.Initialize();和   AddinManager.Registry.Update(NULL);标记的方法   [ClassInitialize]与尝试在构造函数中执行此操作   事情又快乐了。

答案 1 :(得分:0)

最后我设法解决了我的问题:

正如在EDIT3中所写,这是一个加载上下文问题,this blog很好地解释了每种方法的加载行为。

相对于this hint,我使用以下方法手动加载了程序集:

        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.exe路径中(即我的应用程序的ApplicationBase)。最初我认为ApplicationBase与调用程序集的路径相同但不是,仅供参考我发现我使用的应用程序基本路径System.AppDomain.CurrentDomain.BaseDirectory;