我有一个 C# 应用程序需要使用用 VB6 编写的 COM 类。应用程序必须使用动态绑定,因为它必须能够根据用户选择的版本(即,DLL)使用不同版本的代码。程序支持这一点的方式是首先检测注册表中的所有版本,然后让用户选择。
该代码适用于我的机器和我的同行评审者的机器,但是引用 COM 类的代码对于执行质量保证 (QA) 的人来说是崩溃的。
我在代码中放了一个消息框来显示错误,这就是 QAer 得到的:
我发现“FILENOTFOUND”部分特别令人困惑,因为我知道 DLL 存在于她的机器上。事实上,她通过在 DLL 上使用右键单击注册实用程序,亲自在她的机器上注册了 DLL;这与我使用的实用程序相同。
然后我做了一些进一步的调查,以确定究竟是哪条线路崩溃了。下面是用 out 调用有问题的行来实例化 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
为对象获取 a 的行,而是我尝试实例化对象的行。我认为如果找不到 DLL,那么我获取 DLL 的行Type
就会崩溃。
我怀疑这与权限有关,但我在这些方面的调查没有结果。看起来 QAer 具有必要的权限。
注意:在 Windows 文件权限方面,我不是专家。