2012-10-10 38 views
5

Tôi mới sử dụng C# .NET. Tôi viết một phương pháp mà tôi cần phải gọi và chạy một tập tin DLL, nơi tên tập tin DLL xuất phát từ một String variable-từ phương thức C#, cách gọi và chạy DLL, trong đó tên DLL đến từ biến String?

String[] spl; 

String DLLfile = spl[0]; 

Làm thế nào để nhập khẩu DLL này và gọi hàm từ DLL để có được giá trị trả lại? Tôi đã thử cách sau đây ..

String DLLfile = "MyDLL.dll"; 

[DllImport(DLLfile, CallingConvention = CallingConvention.StdCall)] 

Nhưng nó không hoạt động, vì Chuỗi phải ở dạng 'chuỗi ký tự' và 'chuỗi ký tự' không hỗ trợ biến. Xin hãy giúp tôi với thủ tục chi tiết. Cảm ơn.

+1

Có bất kỳ lý do nào tên của dll phải được chứa trong một chuỗi không? Điều này có vẻ nguy hiểm với rất ít lý do chính đáng để làm điều này. –

+2

Dll có phải là một assembly khác không? hoặc có lẽ một c + + dll? hoặc thậm chí là một dll COM ?. – Jamiec

+1

@Ramhound Lý do để thực hiện nó là để bạn có thể chỉ định đường dẫn đầy đủ đến DLL. Nếu không, bạn phụ thuộc vào thứ tự tìm kiếm trong thư viện. Đó là nguy hiểm. Chỉ định đường dẫn đầy đủ là cách tiếp cận tránh nguy hiểm! –

Trả lời

3

Bạn có thể sử dụng LoadAssembly phương pháp, và CreateInstance phương pháp để gọi phương thức

 Assembly a = Assembly.Load("example"); 
     // Get the type to use. 
     Type myType = a.GetType("Example"); 
     // Get the method to call. 
     MethodInfo myMethod = myType.GetMethod("MethodA"); 
     // Create an instance. 
     object obj = Activator.CreateInstance(myType); 
     // Execute the method. 
     myMethod.Invoke(obj, null); 
+2

Chỉ khi nó là một hội đồng quản lý. –

+0

@Darin có cho hội đồng quản lý, cảm ơn cho nhận xét –

+0

Câu hỏi làm cho nó rõ ràng rằng bối cảnh là unmanaged DLLs –

5

Đối với DLL mẹ đẻ bạn có thể tạo lớp tĩnh sau:

internal static class NativeWinAPI 
{ 
    [DllImport("kernel32.dll")] 
    internal static extern IntPtr LoadLibrary(string dllToLoad); 

    [DllImport("kernel32.dll")] 
    internal static extern bool FreeLibrary(IntPtr hModule); 

    [DllImport("kernel32.dll")] 
    internal static extern IntPtr GetProcAddress(IntPtr hModule, 
     string procedureName); 
} 

Và sau đó sử dụng nó như sau:

// DLLFileName is, say, "MyLibrary.dll" 
IntPtr hLibrary = NativeWinAPI.LoadLibrary(DLLFileName); 

if (hLibrary != IntPtr.Zero) // DLL is loaded successfully 
{ 
    // FunctionName is, say, "MyFunctionName" 
    IntPtr pointerToFunction = NativeWinAPI.GetProcAddress(hLibrary, FunctionName); 

    if (pointerToFunction != IntPtr.Zero) 
    { 
     MyFunctionDelegate function = (MyFunctionDelegate)Marshal.GetDelegateForFunctionPointer(
      pointerToFunction, typeof(MyFunctionDelegate)); 
     function(123); 
    } 

    NativeWinAPI.FreeLibrary(hLibrary); 
} 

Nơi MyFunctionDelegate là một delegate. Ví dụ:

delegate void MyFunctionDelegate(int i); 
+1

+1, để có câu trả lời đúng cho đến nay. –

+0

Hi Nikolay Khil, – user1735274

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