Windows7上的.NETCOM互操作64位让我头疼

Windows7上的.NETCOM互操作64位让我头疼,.net,com,interop,windows-7-x64,.net,Com,Interop,Windows 7 X64,到目前为止,.NETCOM互操作一直运行得很好。自从我升级到Windows7后,我的.NETCOM对象就不再工作了 我的COM对象非常简单: namespace Crap { [ComVisible(true)] [Guid("2134685b-6e22-49ef-a046-74e187ed0d21")] [ClassInterface(ClassInterfaceType.None)] public class MyClass : IMyClass {

到目前为止,.NETCOM互操作一直运行得很好。自从我升级到Windows7后,我的.NETCOM对象就不再工作了

我的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
    {

    }
}

组件也标记为可见

我使用

regasm /codebase /tlb "path"
成功注册(管理模式)。 我试过regasm 32和64位。这两次我都犯了错误

“ActiveX组件无法使用以下vbscript创建对象Crap.MyClass”:


dim objReg
Set objReg = CreateObject("Crap.MyClass")
MsgBox typename(objReg)
fuslogvw也没有给我任何提示。 这个COM对象在我的Vista 32位机器上运行得非常好

我不明白为什么我不能用谷歌搜索出解决这个问题的方法。。我真的是唯一一个陷入这个问题的人吗

查看OleView,我看到我的对象已成功注册。我还可以创建其他COM对象。。它只对我自己的不起作用

谢谢,,
凯文

谢谢!我不知道有两个登记处我要处理。。我想是时候切换到Win7 64位了:)

多谢各位

对于遇到相同问题的所有其他人: wscript(通常执行vbs文件的客户端)以64位模式执行=>RegAsm 64位

其他常见客户端(如Excel)在32位模式下执行=>RegAsm 32位将被使用

Visual Studio在32位=>Register for COM interop中执行,仅在32位注册表中注册COM对象

我现在唯一要弄清楚的是如何确保VS Setup同时注册两个版本

我不是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安装会导致问题,特别是卸载(不清理注册表)或重新安装带有.net COM对象的MSI,这些对象会覆盖现有COM条目,会造成各种麻烦

我通常发现,对于x64与x32构建的.net DLL,您必须非常小心。例如,您可能必须显式引用VBS引擎的C:\Windows\SysWow64\或C:\Windows\System32\版本


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

听起来此线程已被回答,请标记对您帮助最大的答案。这应该是一(系列)注释... 或者对原始帖子进行编辑。请将此帖子标记为已回复?谢谢:)