我收到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上下文加载)。一些提示?
答案 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;