1
static void CallUnmanageFunction(string dllName, string functionName, params object[] parameters)
    {
        IntPtr dllHandle = LoadLibrary(dllName);
        IntPtr functionHandle = GetProcAddress(dllHandle, functionName);
        List<Type> typeParameters = new List<Type>();
        foreach (object p in parameters)
        {
            typeParameters.Add(p.GetType());
        }
        Type type = Expression.GetDelegateType(typeParameters.ToArray());         
        Delegate function = Marshal.GetDelegateForFunctionPointer(functionHandle, type);
        function.DynamicInvoke(parameters);
    }

static void Main(string[] args)
    {
        CallUnmanageFunction("user32.dll", "MessageBoxA", IntPtr.Zero, "Es funktioniert", "Test", (uint)0);
    }

ライブラリ名と関数名を文字列として指定し、パラメーターを通常の型 (params object[] パラメーター) として指定して、アンマネージ関数を呼び出したいと考えています。関数 "GetDelegateForFunctionPointer" は非ジェネリック デリゲート タイプを想定していますが、"Expression" クラスの関数 "GetDelegateType" はジェネリックな "Action" または "Func"-Delegate を提供します。この問題を解決するためのアイデアはありますか?

私の悪い英語で申し訳ありません。学校での私の最悪の科目です。ご回答ありがとうございます。:)

4

0 に答える 0