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.
Nguồn
2009-04-24 19:50:25
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
@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? –
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