2009-04-24 30 views
9

Tôi muốn tải động và sử dụng một assembly .Net được tạo trong C# từ một ứng dụng Delphi Win32. Các lớp và giao diện của tôi được đánh dấu là ComVisible, nhưng tôi muốn tránh đăng ký assembly. Điều này có khả thi không?Cách sử dụng .Net assembly từ Win32 mà không cần đăng ký?

P.S. Tôi tìm thấy ở đây link text một cuộc thảo luận tốt về chủ đề, nhưng nó là nhiều hơn xung quanh lưu trữ CLR. Mà đặt ra một câu hỏi - tại sao bạn sẽ lưu trữ CLR so với sử dụng ClrCreateManagedInstance?

+0

Bằng cách lưu trữ CLR bạn giành quyền kiểm soát móc quản lý bộ nhớ và xử lý ngoại lệ được tạo ra để cho phép những thứ như IIS và SQL Server để kiểm soát nhiều khía cạnh như thế nào CLR hoạt động. – dthorpe

+0

@dthorpe Cũng giống như CLR lưu trữ là lựa chọn duy nhất nếu bạn muốn sử dụng .Net4. Bạn có biết nếu nó có chi phí cao hơn so với ClrCreateManagedInstance hoặc đăng ký COM instantiation? –

+0

Tôi nghĩ rằng chi phí sẽ giống nhau. Trong cả ba trường hợp, CLR phải được nạp vào trong tiến trình. Sự khác biệt duy nhất là ai/làm thế nào tải được bắt đầu. – dthorpe

Trả lời

8

Kỳ lạ, tôi không thể tìm thấy câu trả lời trên StackOverflow và không có nhiều trên Net, đặc biệt là cho Delphi. Tôi tìm thấy giải pháp từ các ví dụ được đăng here. Dưới đây là những gì tôi nhận được ở cuối:

function ClrCreateManagedInstance(pTypeName: PWideChar; const riid: TIID; 
out ppObject): HRESULT; stdcall; external 'mscoree.dll'; 

procedure TMyDotNetInterop.InitDotNetAssemblyLibrary; 
var 
    MyIntf: IMyIntf; 
hr: HRESULT; 
NetClassName: WideString; 
begin 
//Partial assembly name works but full assembly name is preffered. 
    NetClassName := 'MyCompany.MyDLLName.MyClassThatImplementsIMyIntf, 
      MyCompany.MyDLLName'; 
    hr := ClrCreateManagedInstance(PWideChar(NetClassName), IMyIntf, MyIntf); 
    //Check for error. Possible exception is EOleException with ErrorCode 
    //FUSION_E_INVALID_NAME = $80131047 2148732999 : The given assembly name 
    //or codebase was invalid. 
    //COR_E_TYPELOAD = $80131522 - "Could not find or load a specific type 
    //(class, enum, etc)" 
    //E_NOINTERFACE = $80004002 - "Interface not supported". 
    OleCheck(hr); 
end; 

BTW, tùy thuộc vào tình hình, bạn có thể muốn tải mscoree.dll động, bởi vì nó có thể là không có mặt trên hệ thống (XP không có .Net Framework)

EDIT: Thật không may, điều này đã không được chấp nhận và ngừng hoạt động với .Net4 như tôi vừa phát hiện ra. Điều này chỉ để lại hai tùy chọn - CLR hosting and unmanaged export. Ngoài ra, debugging of .Net4 COM code is broken.

+2

Lưu ý rằng trừ khi bạn đã tải CLR vào quá trình của mình, ClrCreateManagedInstance sẽ cố tải thời gian chạy v1.0.3705 trước khi thử tải phiên bản mới nhất ... có thể gây ra một số hành vi thú vị. –

0

Thật không may điều này không thể thực hiện (theo kiến ​​thức của tôi) mà không để lộ đối tượng COM, vì .NET dll không được biên dịch thành thư viện mà Delphi (hoặc bất kỳ thứ gì khác) có thể tải, vì tất cả được thực hiện bởi Trình biên dịch JIT khi chạy.

+0

Nhưng bạn không nhất thiết phải đăng ký các lớp COM. –

1

Có thể sử dụng RegFreeCOM và Trình bao bọc có thể gọi được COm.

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

+0

Theo như tôi hiểu, RegFreeCOM là để truy cập COM từ .NET. Câu hỏi của tôi là về truy cập COM được kích hoạt. Net từ mã nguồn gốc. –

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