2009-12-01 28 views
8

Các tùy chọn khi nói đến việc sử dụng .NET DLL từ quy trình Win32 là gì? Tôi cần về cơ bản sử dụng một C# DLL từ một quá trình Win32.Làm thế nào để gọi một DLL .NET từ một tiến trình Win32?

Tôi có một giải pháp có thể ngay bây giờ yêu cầu thêm C# DLL vào GAC (sử dụng RegAsm.exe), sau đó gọi C# DLL qua các cuộc gọi được bao bọc COM. Tuy nhiên giải pháp đó khá nặng. Nó đòi hỏi rằng DLL .NET được thêm vào GAC trên tất cả các máy được cho là chạy quá trình Win32 này.

Có thể thực hiện điều này mà không cần phải gọi RegAsm trước khi có thể sử dụng C# DLL?

+0

Nó không phải nằm trong GAC với tùy chọn Regasm.exe/codebase. –

Trả lời

11

Bạn có thể sử dụng COM không cần đăng ký với các thành phần .NET COM - xem here.

Một tùy chọn khác là sử dụng C++/CLI làm cầu nối. Mọi người hầu như quen thuộc với việc sử dụng nó để bọc các API không được quản lý để hiển thị mã được quản lý, nhưng nó thực sự hoạt động theo cả hai cách - có thể biên dịch với /clr và chưa tạo ra một assembly .dll với xuất khẩu không được quản lý, có thể được gọi từ mã không được quản lý như thường lệ. Dưới đây là một ví dụ rất đơn giản đó cho thấy nhiều System::String::ToUpper theo cách đó:

// compile with cl.exe /clr /LD wrapper.cpp ole32.lib 

#include <windows.h> 

__declspec(dllexport) 
wchar_t* ToUpper(const wchar_t* wcs) 
{ 
    System::String^ s = gcnew System::String(wcs); 
    array<wchar_t>^ chars = s->ToUpper()->ToCharArray(); 

    size_t size = chars->Length * 2; 
    wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2); 
    pin_ptr<wchar_t> src = &chars[0]; 
    memcpy(dst, src, size); 
    dst[chars->Length] = 0; 
    return dst; 
} 

này sẽ sản xuất wrapper.dll - hybrid quản lý/không được quản lý lắp ráp - và một thư viện xuất khẩu wrapper.lib. Sau đó có thể được sử dụng trong một ứng dụng bản địa thuần túy như sau:

// compile with cl.exe test.cpp ole32.lib wrapper.lib 
// note, no /clr 

#include <stdio.h> 
#include <windows.h> 

wchar_t* ToUpper(const wchar_t* wcs); 

int main() 
{ 
    wchar_t* s = ToUpper(L"foo"); 
    wprintf(L"%s", s); 
    CoTaskMemFree(s); 
} 

Trong thực tế nó sẽ được tải runtime CLR vào quá trình gọi điện thoại (trừ khi nó đã được nạp có) và công văn từ mã nguồn gốc từ mã được quản lý minh bạch - tất cả các phép thuật được thực hiện bởi trình biên dịch C++/CLI.

+0

Điều này nghe có vẻ rất tốt, cảm ơn bạn rất nhiều. Tôi sẽ khám phá giải pháp này –

+0

* 'here' * trỏ tới [Cấu hình các thành phần dựa trên .NET để kích hoạt đăng ký miễn phí] (https://msdn.microsoft.com/en-us/library/eew13bza (VS.71) .aspx) ... trong trường hợp MS quyết định di chuyển ... – Wolf

7

Có hai tùy chọn.

Trước tiên, bạn có thể sử dụng Registration Free COM Interop.

Thứ hai, bạn có thể sử dụng CLR Hosting APIs để lưu trữ trực tiếp CLR và tải lắp ráp. Điều này làm việc mà không có COM.

+1

Các API lưu trữ CLR có thể được sử dụng gián tiếp bằng cách khai thác C++/CLI - xem cập nhật cho câu trả lời của tôi. –

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