【发布时间】:2013-06-07 17:46:33
【问题描述】:
我有一个 C# 应用程序需要使用一个用 VB6 编写的 COM 类。应用程序必须使用动态绑定,因为它必须能够根据用户选择的版本(即 DLL)使用不同版本的代码。程序支持的方式是先检测注册表中的所有版本,然后让用户选择。
代码在我的机器和我的同行评审者的机器上运行,但引用 COM 类的代码对于执行质量保证 (QA) 的人来说是崩溃的。
我在代码中放置了一个消息框来显示错误,这就是 QAer 得到的:
我发现“FILENOTFOUND”部分特别令人困惑,因为我知道 DLL 存在于她的机器上。事实上,她通过在 DLL 上使用右键单击注册实用程序,亲自在她的机器上注册了 DLL;这与我使用的实用程序相同。
然后我做了一些进一步的调查,以确定究竟是哪条线路崩溃了。这是用有问题的行实例化 COM 类的代码 :
//Constructor for HtmlRtfConvProxy
public HtmlRtfConvProxy(String convWrapperProj) {
convUtilType = Type.GetTypeFromProgID(convWrapperProj + "." + WRAPPER_CLASS_NAME);
if(convUtilType == null) {
throw new ArgumentException("Unable to find COM class");
}
//The following line is crashing for the person doing QA
vbTargetObject = Activator.CreateInstance(convUtilType);
if(vbTargetObject == null) {
throw new ExternalException("Unable to instantiate COM class");
}
}
我发现更令人困惑的是哪条线路崩溃了。这不是我尝试为对象获取Type 的行,而是我尝试实例化对象的行。我认为如果找不到 DLL,那么我获取 Type 的行就会崩溃。
我怀疑这与权限有关,但我在这些方面的调查没有结果。看起来 QAer 具有必要的权限。
注意:我不是 Windows 文件权限方面的专家。
【问题讨论】:
-
您的 QA 人员是否使用 64 位操作系统,而您使用的是 32 位操作系统,反之亦然?
-
@DarkFalcon QA 人员和我都有 64 位 Windows 7 机器。
-
可能值得运行Process Monitor:它应该向您显示它试图打开的路径和操作系统错误代码(即未找到文件、未找到路径、权限等)
标签: c# com-interop dynamic-binding