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 位进程调用相同的方法,则不会引发异常并且运行良好。

[编辑]如果我通过 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 上下文加载)。一些提示?

4

2 回答 2

0

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

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 monitor, String registryPath, String startupDir, String scanFolder, String[] filesToIgnore) 在 Mono.Addins.Database.SetupDomain.Scan(IProgressStatus monitor ,字符串 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.exe路径中(这是ApplicationBase我的应用程序)。最初我认为ApplicationBase调用程序集的路径相同,但不是,仅供参考,以发现我使用过的应用程序基本路径System.AppDomain.CurrentDomain.BaseDirectory;

于 2012-11-22T15:12:45.987 回答