Создать неуниверсальный тип делегата

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" дает общий "Action" или "Func"-Delegate. Есть ли у кого-нибудь идеи для решения этой проблемы?

Извините за мой плохой английский, это мой худший предмет в школе. Заранее большое спасибо за ответ! :)


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
@ПМФ. Если вы хотите воспроизвести эту проблему, вам нужно настроить атрибут DLLImport на [DllImport(kernel32.dll, CharSet = CharSet.Ansi, SetLastError = true)] с использованием CharSet = CharSet.Ansi   -  person HerbalMart    schedule 05.02.2014
comment
И, возможно, посмотрите здесь заголовок ="можете ли вы использовать net 3 5 action или func в качестве упорядоченных неуправляемых делегатов"> stackoverflow.com/questions/1347484/ поможет.   -  person HerbalMart    schedule 05.02.2014
comment
См. тему: C# GetDelegateForFunctionPointer с универсальным делегатом   -  person Mega WEB    schedule 27.09.2016