Trong C#, tôi đang cố gắng để PInvoke một "đơn giản" chức năng tôi có trong C + +. Vấn đề là tôi không biết tên hoặc vị trí của thư viện vào thời gian biên dịch. Trong C++, điều này rất dễ dàng:PInvoke khi bạn không biết DLL tại thời gian biên dịch?
typedef HRESULT (*SomeFuncSig)(int, IUnknown *, IUnknown **);
const char *lib = "someLib.dll"; // Calculated at runtime
HMODULE mod = LoadLibrary(lib);
SomeFuncSig func = (SomeFuncSig)GetProcAddress("MyMethod");
IUnknown *in = GetSomeParam();
IUnknown *out = NULL;
HRESULT hr = func(12345, in, &out);
// Leave module loaded to continue using foo.
Vì cuộc sống của tôi, tôi không thể tìm ra cách thực hiện điều này trong C#. Tôi sẽ không có bất kỳ rắc rối nếu tôi biết tên dll, nó sẽ trông một cái gì đó như thế này:
[DllImport("someLib.dll")]
uint MyMethod(int i,
[In, MarshalAs(UnmanagedType.Interface)] IUnknown input,
[Out, MarshalAs(UnmanagedType.Interface)] out IUnknown output);
Làm thế nào để làm điều này mà không biết dll Tôi tải từ lúc biên dịch?
Tôi có thiếu gì đó không? Để sử dụng LoadLibrary bạn * làm * cần phải biết tên của dll. Nếu OP _knew_ tên của dll anh ta sẽ không cố gắng và tìm thấy một giải pháp khác nhau ở nơi đầu tiên. Chỉnh sửa: nghĩ rằng tôi đã bỏ lỡ "tại thời gian biên dịch" so với "lúc chạy". –