none
DLL内関数を変則的?に呼び出す方法 RRS feed

  • 質問

  • お世話になっております。

    タイトルがおかしいかも知れませんが、無知な為ご容赦頂けると助かります。

    目的:
    DLL内の関数の呼び出しを変則的に行いたい。

    状況:
    DLL内に、A,B,C,Dという関数が存在するとき
    ユーザの指定した順で、関数をコールする。

    実装:
    当初は関数ポインタを使おうと思いましたが、デリゲートが推奨されているとの事で以下を作成しました。

        public partial class Form1 : Form
        {
            public delegate string TestDelegate();
            TestDelegate[] testDel = new TestDelegate[4];
    
            public Form1()
            {
                InitializeComponent();    
    
                testDel[0] = new TestDelegate(testDll.Class1.a);
                testDel[1] = new TestDelegate(testDll.Class1.b);
                testDel[2] = new TestDelegate(testDll.Class1.c);
                testDel[3] = new TestDelegate(testDll.Class1.d);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                this.textBox1.Text = testDel[1]() + testDel[0]() + testDel[3]() + testDel[2]();
            }
        }

    こうして、ユーザの実行順をIndexによって管理できるのかなと考えたのですが
    思い付きで実装しているため、どこかに問題はないでしょうか?

    その使い方だとダメとか、美しくないとか、ご指摘があれば頂戴したいです。

    以上、宜しくお願い致します。

    2014年12月18日 3:14

回答

  • 当初は関数ポインタを使おうと思いましたが、デリゲートが推奨されているとの事で以下を作成しました。

    C#では、アンマネージ(ネイティブ)の関数ポインタの取得はできますが、マネージの関数ポインタを取得すること、および関数ポインタがポイントしている関数を直接呼び出すことはできません。

    最近では汎用デリゲート型Action<TArg1, ...>とFunc<TArg1, ..., TResult>が多く使われ、独自デリゲート型を新たに定義することはずいぶん減りました。

    全体的には特に問題ない実装かと思います。

    • 回答としてマーク コーベル 2014年12月19日 0:47
    2014年12月18日 3:38
  • というわけで質問文のコードであれば

    Func<string>[] testDel = { testDll.Class1.a, testDll.Class1.b, testDll.Class1.c, testDll.Class1.d, };

    と書けますね。

    • 回答としてマーク コーベル 2014年12月19日 0:47
    2014年12月18日 8:53

すべての返信

  • 当初は関数ポインタを使おうと思いましたが、デリゲートが推奨されているとの事で以下を作成しました。

    C#では、アンマネージ(ネイティブ)の関数ポインタの取得はできますが、マネージの関数ポインタを取得すること、および関数ポインタがポイントしている関数を直接呼び出すことはできません。

    最近では汎用デリゲート型Action<TArg1, ...>とFunc<TArg1, ..., TResult>が多く使われ、独自デリゲート型を新たに定義することはずいぶん減りました。

    全体的には特に問題ない実装かと思います。

    • 回答としてマーク コーベル 2014年12月19日 0:47
    2014年12月18日 3:38
  • Hongliangさん、ご回答ありがとうございます。

    C#では、アンマネージ(ネイティブ)の関数ポインタの取得はできますが、マネージの関数ポインタを取得すること、および関数ポインタがポイントしている関数を直接呼び出すことはできません。

    そうだったのですね、、

    最近では汎用デリゲート型Action<TArg1, ...>とFunc<TArg1, ..., TResult>が多く使われ、独自デリゲート型を新たに定義することはずいぶん減りました。

    なるほど、勉強させて頂きました。

    ありがとうございました!

    2014年12月18日 8:38
  • というわけで質問文のコードであれば

    Func<string>[] testDel = { testDll.Class1.a, testDll.Class1.b, testDll.Class1.c, testDll.Class1.d, };

    と書けますね。

    • 回答としてマーク コーベル 2014年12月19日 0:47
    2014年12月18日 8:53