Създаване на негенеричен тип делегат

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" очаква негенеричен тип делегат, но функцията "GetDelegateType" на класа "Expression" дава общ "Действие" или "Func"-делегат. Някой има ли идея за решаване на този проблем?

Съжалявам за лошия ми английски, това е най-лошият ми предмет в училище. Благодаря ви много предварително за отговора! :)


person Aeon    schedule 02.11.2013    source източник
comment
Защо не използвате MessageBox.Show?   -  person Sriram Sakthivel    schedule 02.11.2013
comment
Предполагам, че това беше само пример.   -  person PMF    schedule 02.11.2013
comment
Хммм... Това се компилира за мен. Каква грешка получавате?   -  person PMF    schedule 02.11.2013
comment
Това е грешка по време на изпълнение: Посоченият тип не трябва да е дефиниция на общ тип. Създавам делегат по време на изпълнение, така че, разбира се, това се компилира перфектно, проблемът е: извиквам GetDelegateType, което създава общ тип делегат (вижте Action‹T› и Func‹T›). Въпросът е: Има ли друг начин за динамично извикване на неуправлявана функция?   -  person Aeon    schedule 04.11.2013
comment
@PMF. Ако искате да възпроизведете този проблем, трябва да коригирате атрибута DLLImport на [DllImport(kernel32.dll, CharSet = CharSet.Ansi, SetLastError = true)] Използване на CharSet = CharSet.Ansi   -  person HerbalMart    schedule 05.02.2014
comment
И може би да погледнете тук stackoverflow.com/questions/1347484/ ще помогне.   -  person HerbalMart    schedule 05.02.2014
comment
Вижте тема: C# GetDelegateForFunctionPointer с общ делегат   -  person Mega WEB    schedule 27.09.2016