![](/img/trans.png)
[英]System.InvalidCastException: Unable to cast object of type x to type y
[英]InvalidCastException: Unable to cast COM object of type x to interface type y
我使用Visual C#Express 2010在计算机#1上编写了一些C#代码。该代码取决于某些已注册DLL的COM对象。 它可以在#1机器上编译并正常运行。 COM对象是从名为BostonWorkstation的程序安装的,该程序安装在#1和#2机器上。
System.InvalidCastException
出现程序错误(如下)。 System.Runtime.InteropServices.COMException (...): Retrieving the COM class factory for component with CLSID {...} failed due to the following error: 80040154 Class not registered (...)
当我尝试在还具有相同确切注册的DLL的计算机#2上运行该程序(在计算机1上编译)时,但是该程序无法运行。 我还尝试在3号机上运行它,该3号机甚至没有DLL,并且按预期会出现不同的错误。
机器2上的运行时错误:
1无法加载BostonWorkstation,错误:System.InvalidCastException:无法将类型为“ System .__ ComObject”的COM对象转换为接口类型为“ BostonWorkStation70.BostonWorkStation”。 此操作失败,因为对IID为“ {8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}”的接口的COM组件上的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE)) 。 在C:\\ Documents and Settings \\ user \\ My Documents \\ Visual Studio 2010 \\ Projects \\ project1 \\ TestBWS \\ CodeFile1.cs中的TestBWS.LoginForm()中:第67行
(Visual Studio文件夹引用只是编译时间路径)
检查计算机1上的注册表,我发现了这一点:
HKEY_CLASSES_ROOT \\ Interface {8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}
REG_SZ的默认值为BostonWorkStation
编码:
using BostonWorkStation70; //line 1
...
try
{
bwsLogin = new BostonWorkStation(); //line 67
}
catch (Exception e)
{
Console.WriteLine("1 Unable to load BostonWorkstation, error: " + e);
System.Console.ReadLine(); //pause the debug window
return false;
}
我曾尝试运行ProcMon来比较机器的进程日志,但是仅此程序就有成千上万的条目,而且我看不到任何丢失的引用。 我进行了比较,但成功的Process日志的行数是原来的5倍。
据我了解,在机器2上运行程序可以将BWS对象创建为通用System.__ComObject
(而不是BostonWorkStation70.BostonWorkStation
),我也不知道为什么。 DLL等绝对在机器2上是正确的,否则我将在运行时得到Class not registered
错误。
为什么编译后的程序不能在计算机2上运行? 所有相关的COM / DLL都在上面。
如果该错误消息来自2号计算机,则您说“未安装Visual C#2010 Express”。
为什么要从默认的Visual Studio项目文件夹运行?
C:\\ Documents and Settings \\ user \\ My Documents \\ Visual Studio 2010 \\ Projects \\ project1 \\ TestBWS \\ CodeFile1.cs:第67行
您可能还有其他问题。
您是否已在第二台计算机上使用regsvr32.exe从库中注册了COM对象类?
要检查是否在第一台和第二台计算机上搜索注册表,以查找所有可能的{8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}
字符串条目。 如果搜索结果不同,则可能是这种情况。
如果BostonWorkstation组件不受管理,请在依赖关系查看器中打开它们,以确保存在所有其依赖的dll。
可能是它们是不受管理的组件,并使用了MSVCRT10。在这种情况下,您将需要在计算机2上安装VS 2010 CRT 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.