2016-05-12 6 views
0

私はinterop-classを持っていますが、それは非常に多くの行を含んでいるので、機能を追加するのはとても面倒です。のは、私は次の操作を行う奨めIDでIDを取得するためのメソッドを持っている必要がありましょう:これを説明するVS2013を使用したデリゲート定義に基づいてC#デリゲートやメソッドなどを生成する方法は?

public class MyInterop 
{ 
    public class WCFDTypes 
    { 
     //.... 
     public delegate int GetInt_Delegate(int id); 
     //... 
    } 

    public class DTypes 
    { 
     //.... 
     public delegate int DotNetInterface_GetInt_Delegate(int id); 
     //... 
    } 

    public WCFDTypes.GetInt_Delegate GetInt; 

    //... 

    private DTypes.DotNetInterface_GetPlotLabel_Delegate Nat_GetInt; 

    //... 

    public MyInterop(string moduleName) 
    { 
     DelegateBuilder builder = new DelegateBuilder(moduleName); 

     //... 
     Nat_GetInt = Build<DTypes.DotNetInterface_GetInt_Delegate>(builder);   

     //.. 
    } 

    //... 

    GetInt = (int id) => 
    { 
     return NatGetInt(id); 
    } 


    public MyInterop(string moduleName) 
    { 
     //... 
     Nat_GetInt = Build<DTypes.DotNetInterface_GetInt_Delegate>(builder);   

     //.. 
    } 


    public MyInterop(MyApplication, string address) 
    { 


     //... 
     GetInt = client.GetInt;   

     //.. 
    } 
} 

は、この質問の範囲を超えています。戻り値の型やパラメータを持たなくても(もちろん、GetIntのようなfucntionalityの名前に基づいて)内部的なクラス、2つのメソッドの宣言、2つのコンストラクタへの修正を行うことができます。

スニペットを探していましたが、見つかった例は非常に基本的でした。

+1

これは確かに最悪の方法です。 [DllImport]やC++/CLIラッパーを使用できない理由は完全には不明です。 –

+0

これは私のコードではありません。私が言ったように、それはこの質問の範囲を超えています。 –

+0

プラスそれはネイティブDLLからのDllImportを使用します。また、外部プラグインのWCFで動作します。 –

答えて

1

System.Reflectionのクラスを使用して、アセンブリからデリゲート定義を読み取ることができます。

public bool IsDelegate(Type type) 
{ 
return type.IsSubClassOf(typeof(Delegate)) || type==typeof(Delegate); 
} 

または名前を知っているタイプをロードするためにはgettype(文字列)を使用します。

Assembly asm = Assembly.LoadFrom(assemblyFile); // path to file 
Type[] types = asm.GetTypes(); 

Hereは、あなたのような方法でデリゲートの種類を認識することができます示唆されました。

そしてhereマイクロソフトノート(強調鉱山):

共通言語ランタイムは、デリゲートと同じ署名を使用して、各デリゲート型のためのInvokeメソッドを提供します。コンパイラが自動的に呼び出すため、このメソッドをC#、Visual Basic、またはVisual C++から明示的に呼び出す必要はありません。 Invokeメソッドは、デリゲートタイプのシグニチャを検索する場合のリフレクションに役立ちます。私はあなたが今、あなたが必要なものを生成することができます期待してこれらを知ること

MethodInfo methodInfo = delegateType.GetMethod("Invoke"); 

だからあなたのデリゲートのPARAMと戻り値の型を伝えるMETHODINFOを取得するには、このようなものを使用します。実行時にメソッドを生成することは可能です。 hereを参照するか、「動的メソッドとアセンブリの出力」を検索してください。

しかし、あなたは代わりに、後で編集用のファイルに(スニペットのような)ソースコードを書くことができ、あなたが希望する場合には、例えば、System.CodeDom.Compilerでコンパイルを自動化することができます。

CodeDomProvider provider = CodeDomProvider.CreateProvider("CS"); // source language 

CompilerParameters compParams = new CompilerParameters(); 
compParams.IncludeDebugInformation = true; 
foreach (string refAsm in referencedAssemblies) { 
    compParams.ReferencedAssemblies.Add(refAsm); 
} 
// etc 

CompilerResults res = provider.CompileAssemblyFromSource(compParams, codeSource); 

if (res.Errors.Count > 0) { 
    // display & throw 
} 

注意をcodeSourceここではソースファイルへのパスではなく、実際のソースコードを含む1つ以上の文字列です。したがって、ファイルに書き込む中間的なステップを使わなくても、ソースを生成してコンパイルすることさえできます。

関連する問題