我使用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 (...)
当我尝试在机器#2上运行该程序(在机器1上编译)时,机器#2也具有相同的注册DLL,但程序无法运行。我也尝试在机器#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 \接口{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来比较机器的进程日志,但是这个程序有数千个条目,而且我没有看到任何丢失的引用。我进行了比较,但成功的过程日志的行数是5倍。
根据我的理解,在机器2上运行程序让它将BWS对象创建为通用System.__ComObject
(而不是BostonWorkStation70.BostonWorkStation
),我不知道为什么。 DLL等在机器2上肯定是正确的,否则我会在运行时遇到Class not registered
错误。
为什么编译后的程序不能在机器2上运行?所有依赖的COM / DLL都在它上面。
答案 0 :(得分:1)
如果该错误消息来自机器#2,那么您所说的那个" Visual C#2010 Express未安装。"
为什么它从默认的visual studio projects文件夹运行?
C:\ Documents and Settings \ user \ My Documents \ Visual Studio 2010 \ Projects \ project1 \ TestBWS \ CodeFile1.cs:第67行
您可能还有其他问题......
答案 1 :(得分:0)
您是否在第二台计算机上使用regsvr32.exe从库中注册了COM对象类?
检查我是否在第一台和第二台机器上搜索注册表,查找所有可能的{8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}
字符串条目。如果搜索结果不同,则可能就是这种情况。
答案 2 :(得分:0)
如果BostonWorkstation组件未受管理 - 在依赖walker中打开它们以确保它们的所有依赖dll都存在。
可能是它们是非托管组件并且使用MSVCRT 10.在这种情况下,您需要在机器2上安装VS 2010 CRT。