2009-08-29 32 views
6

Mỗi ví dụ tôi có thể tìm thấy là trong C + +, nhưng tôi đang cố gắng giữ cho dự án của tôi trong C. Có thể thậm chí có thể lưu trữ CLR trong một chương trình C không?Có thể lưu trữ CLR trong chương trình C không?

Nếu có, bạn có thể chỉ cho tôi một ví dụ không?

+3

CLR API là một API COM. Về cơ bản, bạn nên gọi các giao diện COM trong C. –

+0

... và để làm như vậy, bạn có thể tìm thấy một bài viết ở đây: http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

Tôi sẽ hãy thành thật và nói rằng tôi hoàn toàn không biết mình đang làm gì. Tôi là một anh chàng C#, không phải là một anh chàng C, vì vậy bài viết đó có ý nghĩa rất ít với tôi. Có một ví dụ cụ thể về việc lưu trữ CLR, tạo một cá thể đối tượng .NET và thực hiện một phương thức trên nó (mà tôi nhận ra có lẽ khá phức tạp)? –

Trả lời

10

Như gợi ý nhận xét ở trên, có một bộ COM APIs for hosting the CLR và bạn sẽ có thể gọi các API COM này từ cả C và C++. Ví dụ, dưới đây là một đoạn mã nhanh (chưa được kiểm tra) C cho thấy cách khởi động CLR và thực thi một phương thức tĩnh của một lớp trong một assembly được quản lý (lấy một chuỗi làm đối số và trả về). một số nguyên). Sự khác biệt chính giữa mã này và đối tác C++ của nó là định nghĩa của COBJMACROS và việc sử dụng các macro <type>_<method> (ví dụ: ICLRRuntimeHost_Start) để gọi vào giao diện COM CLR-hosting. (Lưu ý rằng COBJMACROSphải được xác định trước khi #include 'ing mscoree.h để đảm bảo các macro tiện ích được xác định.)

#include <windows.h> 

#define COBJMACROS 
#include <mscoree.h> 

int main(int argc, char **argv) 
{ 
    HRESULT status; 
    ICLRRuntimeHost *Host; 
    BOOL Started; 
    DWORD Result; 

    Host = NULL; 
    Started = FALSE; 

    status = CorBindToRuntimeEx(
       NULL, 
       NULL, 
       0, 
       &CLSID_CLRRuntimeHost, 
       &IID_ICLRRuntimeHost, 
       (PVOID *)&Host 
       ); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    status = ICLRRuntimeHost_Start(Host); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    Started = TRUE; 

    status = ICLRRuntimeHost_ExecuteInDefaultAppDomain(
       Host, 
       L"c:\\path\\to\\assembly.dll", 
       L"MyNamespace.MyClass", 
       L"MyMethod", 
       L"some string argument to MyMethod", 
       &Result 
       ); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    // inspect Result 
    // ... 

cleanup: 
    if (Started) { 
     ICLRRuntimeHost_Stop(Host); 
    } 

    if (Host != NULL) { 
     ICLRRuntimeHost_Release(Host); 
    } 

    return SUCCEEDED(status) ? 0 : 1; 
} 

mẫu này nên làm việc với .NET 2.0+, mặc dù nó trông giống như .NET 4.0 (chưa được phát hành) đã ngừng sử dụng một số API này có lợi cho một số new set of APIs for hosting the CLR. (Và nếu bạn cần điều này để làm việc với .NET 1.x, bạn cần sử dụng ICorRuntimeHost thay vì ICLRRuntimeHost.)

+0

Bất kỳ đoán tại sao điều này sẽ không hoạt động: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname

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