2012-03-20 114 views
-1

我正在开发一些使用COM库的代码。我试图创建一个类的实例,通过Com。 C#创建类型的COM对象

Type t = Activator.CreateInstance("TypeID"); 

但我无法得到它的所有时间= null类型。 progid已经通过Ole/COM Wever查看,似乎我确实输入了它。 在什么可能是prolem?

回答

4

您是否传递了类型ID字符串?尝试从PROGID获取对象类型第一:

Type t = Type.GetTypeFromProgID(progID); 
object obj = Activator.CreateInstance(t); 
+0

没有。我使用它是这样的:Type t = Type.GetTypeFromProgID(progID); dynamic obj = Activator.CreateInstance(t);它总是t == null; – korovaisdead 2012-03-20 13:43:14

+0

那么它是空的还是OBJ? – Strillo 2012-03-20 13:46:03

+0

COM库是否在系统中注册,并确定您不在混合的64/32位环境中(例如:应用程序是64位或“两者”,COM库是32位) – 2012-03-20 13:54:58

-2

的问题是,Activator不能用实例化一个COM对象这样编辑:现在,我强调这是我从你的问题理解您直接将GUID传递给Activator.CreateInstance)。

通常你(通过“添加引用”对话框中,“COM”选项卡)添加到已注册的COM类的引用。然后,您可以像使用其他任何类一样使用COM类。

或者你尝试什么Strillo说:-)

不过,我做我建议的方法有仍保持强类型的优势。

+0

我从OP的理解疑问,他的传球COM类GUID来'Activator.CreateInstance' - 就是为什么我写的,他不能用它*这种方式*。我不是故意说'Activator'不能用来创建COM对象*。 – 2012-03-20 13:57:08

0

我想追加到Strillo的答案,但我没有加注释所需的声誉。

我得到相同的行为shtpavel,直到我手动注册的COM DLL。一旦我注册了COM DLL,Strillo的答案为我工作。

regasm /tlb /codebase project.dll 

Regasm,可以发现:

C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/RegAsm.exe 

的项目设置生成选项卡中查看,下的输出标题有“注册为COM互操作”复选框。我向自己证明这确实会注册COM dll,但是Strillo的答案在我手动注册dll时使用上述命令并不适用于我。

RegAsm - When is the /codebase option applicable?指出,Visual Studio的“注册COM互操作”复选框是同样的事情,我的命令行的解决方案。但是我的经验是,最初“注册COM互操作”还不够。不知道为什么。