2015-01-15 14 views
5

Tôi đã tạo một tệp DLL trong VS2013 bằng cách sử dụng Thư viện tệp/Dự án mới/Lớp. Sau đó tôi đã cố gắng tải nó động trong Delphi. Nhưng Delphiis trả lại NIL cho thủ tục GetProcAddress.Cách tạo DLL trong C# và gọi trong Delphi XE6

C# & Mã Delphi của tôi trông giống như những gì tôi đã đăng bên dưới. Trong mã GetProcAddress đang trả lại NIL. Xin vui lòng cho biết nếu tôi thiếu một cái gì đó.

C# Mã

using System; 
namespace TestDLL 
{ 
    public class Class1 
    { 
     public static string EchoString(string eString) 
     { 
      return eString; 
     } 
    } 
} 

Delphi Mã

Type 
    TEchoString = function (eString:string) : integer;stdcall; 

    function TForm1.EchoString(eString:string):integer; 
    begin 
    dllHandle := LoadLibrary('TestDLL.dll') ; 
    if dllHandle <> 0 then 
    begin 
     @EchoString := GetProcAddress(dllHandle, 'EchoString') ; 
     if Assigned (EchoString) then 
      EchoString(eString) //call the function 
     else 
     result := 0; 
     FreeLibrary(dllHandle) ; 
    end 
    else 
    begin 
     ShowMessage('dll not found ') ; 
    end; 
end; 
+0

Tôi đã thay đổi mã theo đề xuất "không được quản lý chương trình". vẫn không có may mắn. – ary

+0

Tôi không hiểu nhận xét đó. Tôi đã khôi phục bản chỉnh sửa của bạn. Xin đừng thay đổi câu hỏi. Bằng mọi cách, hãy thêm nhiều hơn để yêu cầu làm rõ, nhưng đừng thay đổi hoàn toàn làm mất hiệu lực lịch sử. –

+0

Ngoài ra, sẽ tốt hơn nếu bạn không đăng mã giả mạo. Mã C# là giả mạo. –

Trả lời

4

Một C# DLL là một hội đồng quản lý và không xuất khẩu chức năng của nó thông qua xuất khẩu PE cổ điển. Tùy chọn của bạn:

  1. Sử dụng chế độ hỗn hợp C++/CLI để bọc C#. Sau đó, bạn có thể xuất các chức năng ở chế độ không được quản lý theo cách thông thường.
  2. Sử dụng số điện thoại UnmanagedExports của Robert Giesecke. Điều này có lẽ thuận tiện hơn so với trình bao bọc C++/CLI.
  3. Hiển thị chức năng được quản lý dưới dạng đối tượng COM.

Sau khi bạn chọn một trong các tùy chọn này, bạn sẽ phải đối phó với việc lạm dụng loại dữ liệu . Đó là một kiểu dữ liệu Delphi riêng tư không hợp lệ cho interop. Đối với ví dụ đơn giản trong câu hỏi PWideChar là đủ.

+0

Tôi vừa đánh dấu là trùng lặp và liên kết với câu trả lời trước đó của bạn! Trong các ý kiến ​​của câu trả lời của bạn nó thậm chí đề cập đến mức độ thường xuyên câu hỏi này được hỏi :-) Tôi vẫn lên bình chọn câu trả lời của bạn mặc dù! – Belogix

+0

Vậy đây có phải là các bước bổ sung mà tôi cần phải thực hiện không? 1.Install-Package UnmanagedExports trong C#. Thêm [DllExport ("EchoString")] ở trên hàm EchoString trong C#. Tôi đã làm các bước trên và vẫn không hoạt động. Bất cứ điều gì khác tôi đang mất tích ?? – ary

+0

Vâng, không phải tất cả chúng. Đây là những lựa chọn của bạn. UnmanagedExports là đơn giản nhất. –

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