2010-01-19 3 views
5

Tôi đã cố gắng để có được một đăng ký miễn phí. NET dựa COM DLL để làm việc, nhưng không thành công.Cấu hình các thành phần dựa trên .NET để kích hoạt đăng ký miễn phí

  • Trong Visual Studio 2008, tôi đã thêm một thư viện lớp C# mới.
  • Tôi đã bật tùy chọn 'thực hiện lắp ráp COM-hiển thị' và 'đăng ký COM interop'.
  • Tôi đã thêm giao diện công cộng và lớp học với một số chức năng.
  • Tôi đã thêm một sự phụ thuộc manifest đến C++ của tôi ứng dụng client: #pragma comment (mối liên kết, "/ manifestdependency ...

Nhưng khi tôi bắt đầu ứng dụng của tôi tôi nhận được 'ứng dụng đã thất bại trong việc bắt đầu vì các ứng dụng cấu hình không chính xác '.

Tôi đã sử dụng công cụ mt của Microsoft để trích xuất tệp kê khai của cả ứng dụng khách C++ và C# COM DLL và thông tin trong cả hai đều giống nhau (tệp dependAssembly trong tệp kê khai C++ chứa cùng tên và phiên bản với tên assemblyIdentity trong tệp kê khai COM).

Tôi cũng đã thử cách tiếp cận được mô tả trên http://msdn.microsoft.com/en-us/library/eew13bza.aspx nhưng với kết quả tương tự.

Tương tự như vậy, tôi đã cố thêm một tham chiếu vào dự án COM của tôi trong 'Khung và Tài liệu tham khảo' của ứng dụng khách C++ của tôi. Thông tin trên trang thuộc tính đó trông đầy hứa hẹn (nó hiển thị các tùy chọn như 'sao chép cục bộ', 'sao chép phụ thuộc', v.v. và các thuộc tính như 'assemblyIdentity'), nhưng Visual Studio không sao chép các tệp DLL cũng như tự động thêm tệp phụ thuộc vào tệp kê khai.

Lưu ý rằng 'biến thể đã đăng ký' hoạt động tốt.

Bất kỳ ai có ý tưởng về những gì tôi đang làm sai?

Cập nhật:

  • Khi tôi tạo ra một C++ DLL đơn giản và nhúng một biểu hiện có cùng tên và phiên bản của tôi NET COM DLL (giống assemblyIdentity) ứng dụng của tôi khởi động tốt. Vì vậy, vấn đề nằm với tập tin manifest của tôi. NET COM DLL.
  • Tôi có thể trích xuất thành công tệp kê khai từ tệp DLL bằng mt -managedassemblyname:... và sau đó nhúng cùng một tệp kê khai với mt -outputresource:..., nhưng điều này cũng không khiến Windows giải quyết thành công sự phụ thuộc.

Trả lời

4

tôi thấy các bước cần thiết để có được đăng ký miễn phí NET COM interop bản thân mình làm việc :-)

  • Run: mt -managedassemblyname:"myDll.dll" -out:"myDll.manifest"
  • sạch manifest (xem định dạng tại http://msdn.microsoft.com/en-us/library/eew13bza.aspx). Chủ yếu là tôi cần phải loại bỏ tất cả các thẻ ngoại trừ assemblyIdentity, clrClass và file (và đặc biệt loại bỏ các thẻ runtime, mvid và dependency).
  • Chạy mt -outputresource:"myDll.dll" -manifest "myDll.manifest". Về cơ bản, điều này bổ sung thêm tệp kê khai đã sửa đổi làm tài nguyên cho tệp DLL. Lưu ý rằng đây rõ ràng không phải là cùng một tệp kê khai (vị trí)! Nếu tôi reextract manifest với tùy chọn managedassemblyname tôi vẫn nhận được biểu hiện 'cũ'. Nếu tôi giải nén nó bằng tùy chọn inputresource, tôi sẽ lấy nó.

Tôi thấy rất nhiều điều này nhờ Windows Vista. Không giống như Windows XP của tôi, nó chứa một công cụ được gọi là sxstrace cung cấp thông tin khá chi tiết về các vấn đề với việc thực hiện song song.

+0

Giải pháp tuyệt vời! Điều này đơn giản hóa quá trình cài đặt đáng kể. Cảm ơn rất nhiều! –

+0

Xin chào, tôi có một C++ lắp ráp mà không một cocreate của một hội COM quản lý và tôi cần cơ chế tương tự. Tôi muốn bỏ qua việc triển khai .Net hiện tại và muốn nó thực hiện cuộc gọi mới của tôi. Việc lắp ráp C++ lần lượt được tải thông qua một exe .Net. Vậy, bản kê khai nên được thiết kế như thế nào cho phe C++? –

-2

Khi tôi làm điều này, tôi bắt đầu với một thành phần cơ bản rất đơn giản để sắp xếp công cụ COM. Ngoài ra tôi đã sử dụng một khách hàng kịch bản trong sự phát triển ban đầu.

Tôi không sử dụng Visual Studio, nhưng thay vào đó là trình soạn thảo văn bản cho mã .NET. Tôi chèn GUIDs cho hội đồng và cho giao diện, và đánh dấu các giao diện cho AutoDispatch.

using System; 
using Interop=System.Runtime.InteropServices; 

namespace Whatever 
{ 
    [Interop.Guid("xxxxxxxx-9120-4283-b972-changethis05")] 
    [Interop.ComVisible(true)] 
    [Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)] 
    public partial class MyClass : 
    ... 
} 

Tôi đảm bảo lớp của tôi có hàm tạo mặc định (không có đối số).

Tôi chạy regasm /codebase bằng tay, từ dòng lệnh, chỉ định hội đồng .NET.

Tôi đã mã hóa JavaScript để khởi tạo đối tượng.

Khi mọi thứ trở nên khó hiểu, tôi đã kiểm tra ProgId bằng OleView.exe.

Khi bạn có công cụ rất cơ bản, hãy tăng dần độ phức tạp, cho đến khi bạn nhận được giải pháp làm việc.


Bạn cũng có thể sử dụng phương pháp này theo hướng khác; từ khách hàng. Các hội đồng .NET như System.Random được đánh dấu cho COM interop khi bạn cài đặt .NET, vì vậy bạn có thể sử dụng chúng để xác minh rằng cách tiếp cận của bạn trong C++ là chính xác. Khởi tạo System.Random ProgId là một cái gì đó giống như "hello, World" của C++ - to-.NET-via-COM. Nếu điều đó thành công, thì bạn biết cách tiếp cận cơ bản trong C++ là âm thanh.

+0

Interop COM của tôi hoạt động tốt. Vấn đề chỉ đơn giản là với phần đăng ký miễn phí. Tôi không thể nhúng thành công tệp kê khai của mình để ứng dụng của tôi có thể giải quyết sự phụ thuộc. Thx cho câu trả lời mặc dù. –