2011-01-09 22 views
13

Tôi có một nhiệm vụ đơn giản:Làm thế nào để sử dụng một .Net hội trong Delphi mà không cần đăng ký nó trong GAC hoặc COM?

là có thể viết một DLL Delphi và đặt .Net Assembly (chỉ với một giao diện với 4 phương thức và một lớp thực hiện giao diện) bên cạnh nó và gọi nó từ Delphi DLL ?

Ý tôi là, tôi có thể nhập các loại .Net trực tiếp từ .Net assembly (tên tệp tương đối) nếu tôi tạo một đơn vị tlb và delphi cho tlb, mà không cần đăng ký Assembly/tlb?

tốt nhất, thalm

EDIT (những gì tôi tìm thấy):

Hầu hết các giải pháp phải đăng ký ít nhất một dll/TLB cho COM. Nhưng điều hứa hẹn nhất tôi tìm thấy là: Unmanaged Exports từ Robert Giesecke, một Visual mẫu dự án Studio của nó cho phép bạn viết phương pháp tĩnh C# (hoặc bất kỳ ngôn ngữ Net) và gọi cho họ từ bất kỳ ngôn ngữ không được quản lý, tuyệt vời:

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.StdCall)] 
    public static int Add(int left, int right) 
    { 
     return left + right; 
    } 
} 

EDIT 2: Nó thực sự hoạt động! Bạn thậm chí có thể kiểm soát các loại marshalling, unbeliveable !!!

+1

Tìm kiếm tin tức hay. Nó gần như ngay lập tức có ý nghĩa một khi nhớ rằng tiêu đề .Net chỉ là một phần mở rộng của định dạng COFF. Tôi đã có bài viết tuyệt vời với chi tiết về các vị trí .Net nhưng không thể tìm thấy nó ngay bây giờ. Đây có thể là cách tốt hơn (không đơn giản hơn) để thực hiện: http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx – user44298

+0

cont. Một tiện ích hữu ích khác mà tôi đã tìm thấy nhờ nghiên cứu giải pháp của bạn có thể hữu ích cho khách truy cập http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx – user44298

+0

@Ivo, đây chỉ là cách phổ biến lưu trữ CLR và sử dụng COM interop qua mscoree để truy cập các loại của bạn. (Không chắc chắn nếu ngay cả một bài viết codeproject là thực sự hữu ích cho một cái gì đó đã được tài liệu trên msdn http://msdn.microsoft.com/en-us/library/dd380850.aspx) Điều này là hoàn toàn tốt đẹp cho rất nhiều trường hợp sử dụng, đặc biệt là nếu bạn muốn nhiều hơn chỉ là phương pháp và sử dụng một ngôn ngữ có xử lý COM tốt như C + + hoặc Delphi. Nó không giúp bạn khi bạn phải có một DLL "thực" mặc dù. ;-) –

Trả lời

5

Một lời khuyên nhỏ: Bạn không phải đặt hàng xuất khẩu của mình ở chế độ công khai.

Lớp học của bạn đã sẵn sàng, vì vậy lớp học sẽ không hiển thị khi được tiêu thụ từ một hội đồng khác.

Tuy nhiên, cũng hoàn toàn tốt để thêm xuất vào lớp tĩnh hiện có, nhưng khai báo nó là riêng tư để nó không hiển thị khi được tiêu thụ từ .Net. (Xuất khẩu không được quản lý có xu hướng trông hơi đáng sợ)

0

Bạn có thể thực hiện việc này bằng cách sử dụng Đăng ký miễn phí COM. Xem câu trả lời của tôi cho câu hỏi về Đăng ký miễn phí com here. Với một hội đồng .NET, bạn cần phải làm cho các giao diện và phương thức của bạn COMVisible, như thể bạn sẽ sử dụng đối tượng bằng cách sử dụng COM đã đăng ký. Nếu bạn sau đó làm theo câu trả lời của tôi về câu hỏi tôi vừa đề cập, bạn sẽ có thể đặt bên cạnh dll. Sự khác biệt duy nhất là bạn cần phải đặt thông tin trong tệp kê khai assembly (được quản lý) về các lớp COM mà bạn đang xuất. Nếu bạn nhìn vào tài liệu trên trang web microsoft về các biểu hiện ứng dụng và lắp ráp, bạn nên tìm hiểu cách thực hiện điều này. Thuộc tính tệp kê khai bạn đang tìm kiếm là CLRClass. Nếu bạn có tất cả mọi thứ thiết lập đúng cách, bạn chỉ cần đặt các dll quản lý bên cạnh với thực thi cuộc gọi và tất cả mọi thứ hoạt động.

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