2010-05-01 38 views
6

.NET COM interop cho đến nay luôn hoạt động khá độc đáo. Kể từ khi tôi nâng cấp lên Windows 7 tôi không nhận được các đối tượng .NET COM của tôi để làm việc nữa..NET COM Interop trên Windows 7 64Bit mang lại cho tôi một nhức đầu

đối tượng COM của tôi là dễ dàng như:


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 
    { 

    } 
} 

 

lắp ráp được đánh dấu ComVisible là tốt.

tôi đăng ký assembly bằng

regasm /codebase /tlb "path"

đăng ký thành công (chế độ quản trị). Tôi đã thử chế độ 32 và 64 bit. Cả hai lần tôi nhận được lỗi

"ActiveX thành phần không thể tạo đối tượng Crap.MyClass" sử dụng VBScript này:


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

fuslogvw không cho tôi bất kỳ gợi ý một trong hai. Đối tượng COM đó hoạt động hoàn hảo trên máy Vista 32 bit của tôi.

Tôi không hiểu tại sao tôi không thể tìm ra giải pháp cho vấn đề đó .. Tôi có thực sự là người duy nhất từng gặp vấn đề đó không?

Nhìn vào OleView Tôi thấy đối tượng của mình được đăng ký thành công. Tôi cũng có thể tạo các đối tượng COM khác .. nó chỉ không hoạt động với các đối tượng của riêng tôi.

Cảm ơn bạn, Kevin

+0

Bạn có thể đánh dấu chuỗi này là đã trả lời không? Cảm ơn :) –

Trả lời

2

Tôi không phải là người # C, nhưng đây là một ví dụ mà tôi chuyển đổi từ VB.net. Lưu ý, tôi đã phải đảm bảo rằng tôi đã có một không gian tên duy nhất ở cấp dự án, sau đó lớp này trong các dự án VB. Tôi hiểu điều đó khác trong C# Projects.

[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() 
    { 
    } 
} 

Nếu tôi lo ngại về COM, tôi luôn kiểm tra đăng ký trước để đảm bảo các mục nhập phù hợp đã được tạo. Tôi đã tìm thấy rằng versioning và cài đặt MSI gây ra các vấn đề, expecially gỡ bỏ cài đặt (không dọn dẹp registry) hoặc cài đặt lại và MSI với .net COM đối tượng mà ghi đè một mục COM hiện có gây ra tất cả các loại phức tạp.

Tôi thường thấy rằng bạn phải cẩn thận về x64 vs x32 xây dựng .net DLL.Ví dụ, bạn có thể phải tham khảo một cách rõ ràng C: \ Windows \ SysWow64 \ hoặc C: \ Windows \ System32 \ phiên bản của công cụ VBS.

Cuối cùng nếu bạn sử dụng VBS trong trang web ASP trên máy chủ x64 với thành phần COM .net, bạn cần phải đảm bảo tùy chọn nâng cao ứng dụng 32 bit là ứng dụng 32 bit được đặt đúng/sai.

1

Cảm ơn! Không biết có 2 đăng ký tôi phải chăm sóc .. là về thời gian để chuyển sang Win7 64 bit tôi đoán :)

Cảm ơn bạn.

Đối với tất cả mọi người khác mà chạy vào cùng một vấn đề: wscript (client thực thi vbs tập tin này thường) được thực hiện trong chế độ 64bit => regasm 64bit được sử dụng

khách hàng thông thường khác như Excel được thực hiện trong Chế độ 32 bit => RegAsm 32bit sẽ được sử dụng.

Visual Studio được thực thi trong 32 bit => Đăng ký cho COM interop chỉ đăng ký đối tượng COM trong đăng ký 32 bit.

Điều duy nhất bây giờ tôi phải hình dung ra là làm thế nào để đảm bảo rằng VS cài đặt đăng ký cả hai phiên bản

+1

Âm thanh như chuỗi này được trả lời, vui lòng đánh dấu câu trả lời đã giúp bạn nhiều nhất. –

+0

Điều này phải là (một loạt) nhận xét ... hoặc chỉnh sửa cho bài đăng gốc. –

Các vấn đề liên quan