2010-05-01 63 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