2010-05-01 58 views
6

到目前为止,.NET COM互操作性一直很好。由于我升级到Windows 7,我不再让我的.NET COM对象工作了。Windows 7上的.NET COM互操作64Bit让我头疼

我的COM对象是一样简单:


namespace Crap 
{ 
    [ComVisible(true)] 
    [Guid("2134685b-6e22-49ef-a046-74e187ed0d21")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class MyClass : IMyClass 
    { 

     public MyClass() 
     {} 

     public void Test() 
     { 
      MessageBox.Show("Finally got in here."); 
     } 

    } 
} 



namespace Crap 
{ 
    [Guid("1234685b-6e22-49ef-a046-74e187ed0d21")] 
    public interface IMyClass 
    { 

    } 
} 

 

组件被标记标记有ComVisible特性为好。

我寄存器使用

regasm /codebase /tlb "path"

注册成功(管理模式)的组件。 我试过regasm 32和64位。这两个时间我得到的错误

“ActiveX组件不能创建对象Crap.MyClass”使用该VBScript中:


dim objReg 
Set objReg = CreateObject("Crap.MyClass") 
MsgBox typename(objReg) 
 

fuslogvw不给我任何提示无论是。 COM对象在我的Vista 32位机器上完美工作。

我不明白为什么我一直没有能够谷歌解决方案,这个问题..我真的是唯一的人,有过这个问题?

看着OleView我看到我的对象注册成功。我也可以创建其他COM对象。它只适用于我自己的COM对象。

谢谢 凯文

+0

您能否将此线标记为已回答?谢谢:) – 2010-05-20 10:39:27

回答

2

我不是一个C#的人,但这里是我从VB.net转换的样本。请注意,我必须确保在项目级别有一个名称空间,然后在VB项目中有这个类。我明白这在C#项目中有所不同。

[ComClass(MyClass.ClassId, MyClass.InterfaceId, MyClass.EventsId)] 
public class MyClass { 

    // These GUIDs provide the COM identity for this class 
    // and its COM interfaces. If you change them, existing 
    // clients will no longer be able to access the class. 
    public const string ClassId = "f58411e1-1689-4bf3-a0e1-b49f479e28ba"; 
    public const string InterfaceId = "f4a575c6-62d2-44eb-af0f-f5b2bb65ad51"; 
    public const string EventsId = "ad56e4f9-3512-4233-aae4-7d1c2457c08f"; 

    // A creatable COM class must have a Public Sub New() 
    // with no parameters, otherwise, the class will not be 
    // registered in the COM registry and cannot be created 
    // via CreateObject. 
    public SalePayStatus() : base() 
    { 
    } 
} 

如果我关心COM,我总是先检查注册表以确保已创建适当的条目。我发现版本控制和MSI安装会导致问题,特别是卸载(不清理注册表)或重新安装,MSI和.net COM对象覆盖现有的COM条目导致各种麻烦。

我通常发现你必须小心x64与x32 build .net dll。例如,您可能必须明确引用VBS引擎的C:\ Windows \ SysWow64 \或C:\ Windows \ System32 \版本。

最后,如果您在具有x32 COM .net组件的x64服务器上的ASP网站中使用VBS,则需要确保IIS 7应用程序池高级选项是否将32位应用程序正确设置为True/False。

1

谢谢!不知道有2注册我必须照顾..是时候切换到Win7的64位,我猜:)

谢谢。

对于其他人,运行到同一个问题: WScript的(即执行通常VBS文件的客户机)在64位模式中执行=> RegAsm 64位将被用于如Excel

其他常见的客户端中执行的32位模式=>使用RegAsm 32位。

Visual Studio在32位中执行=>注册COM互操作只在32位注册表中注册COM对象。

我现在要弄清楚的唯一的事情就是如何确保VS设置寄存器两个版本

+1

听起来像这个线程被回答,请标记最有帮助的答案。 – 2010-05-05 19:57:23

+0

这应该是(一系列)评论...或对原始帖子的编辑。 – 2014-09-23 21:12:30