【发布时间】:2011-09-02 22:01:02
【问题描述】:
我有一堆 COM 对象,它们都实现了相同的接口,并且需要在运行时从选项列表中选择其中一个来创建它们。因为我知道每个实现 COM 服务器的 CLSID,所以这应该很容易。但是,对于 COM 库的某个子集,我只能在 VS2010 IDE 内部运行时才能完成这项工作。
这是我用来测试的整个程序:
using System;
namespace ComTest
{
class Program
{
static void Main(string[] args)
{
var clsid = "{E8978DA6-047F-4E3D-9C78-CDBE46041603}";
var type = Type.GetTypeFromCLSID(new Guid(clsid));
var obj = Activator.CreateInstance(type, true);
Console.WriteLine("Obj is {0}", obj);
}
}
}
只要我通过 VS2010 运行,我可以为迄今为止我尝试过的每个 COM CLSID 进行这项工作。无论是否附加了调试器,无论是否附加了托管进程,我都会从CreateInstance 收到System.__ComObject。
当我从控制台窗口编译并运行此代码时,对于某些 CLSID 值,我会得到:
Unhandled Exception: System.Runtime.InteropServices.COMException: Creating an instance of the COM component with CLSID {E8978DA6-047F-4E3D-9C78-CDBE46041603} from the IClassFactory failed due to the following error: 80004005.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at ComTest.Program.Main(String[] args) in
这只发生在特定的 CLSID 上——例如,“{c1243ca0-bf96-11cd-b579-08002b30bfeb}”(内置文本 IFilter)有效,但“{E8978DA6-047F-4E3D-9C78-CDBE46041603} "(Acrobat Reader X 的 IFilter)没有。我无法弄清楚通过 IDE 运行对 COM 互操作调用是否成功有何不同。有什么想法吗?
编辑:
我没有以管理员身份运行 VS2010,但我已经尝试通过提升的 Powershell 控制台运行输出二进制文件,但仍然无法正常工作。
编辑 2:
到目前为止,我使用的唯一一个重现此“错误”的 COM 服务器是 Acrobat Reader X 的 AroRdIf.dll(以前的版本可以正常工作)。我不再担心让 Acrobat 的特定 IFilter 工作了,但我非常担心我的代码在我的 IDE 中运行但不在它之外。而且,顺便说一句,Windows SDK FILTDUMP 工具在加载此 COM 服务器时没有问题,所以我知道这是可能的,只是不知道如何。
【问题讨论】:
-
您是在中等信任还是完全信任环境中运行?
-
或者在 Windows Vista 或 7 上运行并以管理员身份运行 VS?
-
是的,我知道 Adobe“说”他们的 IFilter 在 Windows 7 上“不起作用”,但 Windows SDK 中的 IFilter 测试程序使用 IFilter 从 PDF 中提取文本没有问题,并且我可以在 VS 内做的很好,只是不能在它之外:\
-
没有复制顺便说一句,当我尝试时工作正常。错误代码很糟糕,E_FAIL 仅表示“无法使其工作,不知道为什么”。对于劣质 COM 服务器来说并非不典型。
-
人力资源部。也许我会把这个发给我的同事,看看他们中有多少人获得了成功的文本阅读。也许这只是我的环境中的某些东西。谢谢:)
标签: c# interop com-interop