2009-08-29 14 views
6

私が見つけることができるすべての例はC++ですが、私のプロジェクトをC言語で保存しようとしています.CプログラムでCLRをホストすることも可能ですか?CプログラムでCLRをホストすることはできますか?

もしそうなら、例を教えてください。

+3

CLR APIはCOM APIです。基本的には、CでCOMインターフェイスを呼び出す必要があります。 –

+0

...このため、ここで記事を見つけることができます:http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

私は私が何をしているのか全く分かりません。私はCの男、Cの男ではないので、その記事はほとんど私には意味がありません。 CLRをホストし、.NETオブジェクトインスタンスを作成し、そこでメソッドを実行する具体的な例がありますか(これはおそらくかなり複雑です)。 –

答えて

10

上記のヒントとして、COM APIs for hosting the CLRのセットがあります。これらのCOM APIは、CとC++の両方から呼び出すことができます。

例として、CLRを起動し、管理されたアセンブリ内のクラスの静的メソッドを実行する方法を示す簡単な(テストされていない)Cコードを示します(これは文字列を引数として取り込みます)。整数)。このコードとそのC++の対応物との主な相違点は、COBJMACROSの定義と、ICLRRuntimeHost_Startのマクロの使用がCLRホスティングCOMインターフェイスを呼び出すことです。 (COBJMACROSこれらのユーティリティのマクロが定義され得ることを確認するためにmscoree.hをINGの」前#includeに定義されなければならないことに注意してください。)

#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; 
} 

それは.NET 4.0(ように見えますが、このサンプルでは、​​.NET 2.0以上で動作するはずですまだリリースされていない)は、new set of APIs for hosting the CLRのためにこれらのAPIの一部を非難しました。 (そして、.NET 1.xで動作させるには、ICLRRuntimeHostの代わりにICorRuntimeHostを使用する必要があります)。

+0

これはうまくいかないと思われます:http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname

関連する問題