【问题标题】:nonsense argument exception calling method废话参数异常调用方法
【发布时间】: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


【解决方案1】:

在 Google Group 中找到了这个,它在相同的方法上提到了相同的异常:

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 监视器,字符串 registryPath,字符串 startupDir,字符串 scanFolder, 字符串 [] 文件忽略) 在 Mono.Addins.Database.SetupDomain.Scan(IPProgressStatus 监视器,字符串 registryPath,字符串 startupDir,字符串 scanFolder, C:\Users\Kiel\Projects\Mono.Addins 中的 String[] filesToIgnore) \Mono.Addins\Mono.Addins.Database\SetupDomain.cs:第 43 行
内部异常:

解决方案:

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

【讨论】:

  • 不走运,还是同样的错误。我的项目不是测试项目,所以对于普通项目来说,类似于 [ClassInitialize] 的东西应该可以工作吗?我不知道什么是 ClassInitialize..
【解决方案2】:

终于解决了我的问题:

正如 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多