2009-11-18 5 views
1

У меня есть .dll написанных на C++ с использованием функцией, определенной как это:PInvoke с «странными» функциями

EDK_API int EE_CognitivSetCurrentLevel (unsigned int userId, 
    EE_CognitivLevel_t level, 
    EE_CognitivAction_t level1Action, 
    EE_CognitivAction_t level2Action, 
    EE_CognitivAction_t level3Action, 
    EE_CognitivAction_t level4Action 
)  

Set the current Cognitiv level and corresponding action types. 


Parameters: 
userId - user ID 
level - current level (min: 1, max: 4) 
level1Action - action type in level 1 
level2Action - action type in level 2 
level3Action - action type in level 3 
level4Action - action type in level 4 

использованием этой функции, как вы можете видеть выше: если уровень = 1, то» буду называться так:

EE_CognitivSetCurrentLevel(userId,1,level1Action); 

если уровень = 2, то:

EE_CognitivSetCurrentLevel(userId,2,level1Action,level2Action); 

и так далее ...

Как я могу вызвать эту функцию в C#?

спасибо!

+0

Используется ли функция C++ 'EE_CognitivSetCurrentLevel()' для использования параметров по умолчанию или это функция '__cdecl', которая принимает переменное число параметров? В зависимости от этого правильный подход будет различным. –

+0

К сожалению, у меня нет исходного исходного кода dll. Как я могу узнать, что он написан для использования параметров по умолчанию или это функция * _cdecl *? – Vimvq1987

+0

Если по умолчанию не используется одно и то же соглашение, вы получите неправильные аргументы. Если вы хотите o установить его явно, добавьте это внутри аргументов DllImport в свой ответ: CallingConvention = CallingConvention.Cdecl. Ознакомьтесь с http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx для других параметров, если необходимо. – Gonzalo

ответ

3

Предполагая EE_CognitivLevel_t и EE_CognitivAction_t являются целыми числами:

[DllImport ("yourdll", EntryPoint ("EE_CognitivSetCurrentLevel")] 
extern static int EE_CognitivSetCurrentLevel1 (int level, int level1); 

[DllImport ("yourdll", EntryPoint ("EE_CognitivSetCurrentLevel")] 
extern static int EE_CognitivSetCurrentLevel2 (int level, int level1, int level2); 

И так далее ... Ох, и убедитесь, что функция внутри экстерном «C» {}, так что компилятор C++ не искажать имя ,

2

Поскольку это функция C++, я предполагаю, что она имеет default parameters. То есть, когда вы вызываете функцию с слишком небольшим количеством параметров, компилятор C++ автоматически заполняет отсутствующие параметры со значениями по умолчанию. C# не поддерживает параметры по умолчанию и не вызывает вызов из DLL. Если это так, то вам нужно выяснить, что представляют собой эти параметры по умолчанию и вручную передать их. Если вы передадите неправильное количество параметров функции, вы получите странное поведение (или это может сработать, кто знает).

Вы можете использовать перегрузки в C#, чтобы обеспечить такое же поведение, которое вы видите на C++:

class EEFunctions { 
    [DllImport ("yourdll", EntryPoint ("EE_CognitivSetCurrentLevel")] 
    private extern static int EE_CognitivSetCurrentLevelDLL(int level, int level1, 
     int level2, int level3, int level4); 

    private int defaultLevel = 0; // This is just an example 

    public static int EE_CognitivSetCurrentLevel(int level, int level1) { 
     return EE_CognitivSetCurrentLevel(level, level1, 
      defaultLevel, defaultLevel, defaultLevel); 
    } 

    public static int EE_CognitivSetCurrentLevel(int level, int level1, int level2) { 
     return EE_CognitivSetCurrentLevel(level, level1, 
      level2, defaultLevel, defaultLevel); 
    } 

    public static int EE_CognitivSetCurrentLevel(int level, int level1, 
     int level2, int level3) { 
     return EE_CognitivSetCurrentLevel(level, level1, 
      level2, level3, defaultLevel); 
    } 

    public static int EE_CognitivSetCurrentLevel(int level, int level1, 
     int level2, int level3, int level4) { 
     return EE_CognitivSetCurrentLevel(level, level1, 
      level2, level3, level4); 
    } 
} 

Это также предполагает, что все параметры Интс. Если вы можете найти определения типов параметров в заголовках C++, вы можете создавать совместимые типы на C#.

Смежные вопросы