PInvoke со «странной» функцией - PullRequest
1 голос
/ 18 ноября 2009

У меня есть .dll, написанная на C ++ с функцией, определенной следующим образом:

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 

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

EE_CognitivSetCurrentLevel(userId,1,level1Action);

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

EE_CognitivSetCurrentLevel(userId,2,level1Action,level2Action);

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

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

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 18 ноября 2009

Предполагая, что 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 голосов
/ 18 ноября 2009

Поскольку это функция C ++, я предполагаю, что она имеет параметры по умолчанию. То есть, когда вы вызываете функцию со слишком малым количеством параметров, компилятор 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 #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...