具有“奇怪”功能的PInvoke

时间:2009-11-18 04:04:30

标签: c# c++ pinvoke

我有一个用C ++编写的.dll,其函数定义如下:

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 个答案:

答案 0 :(得分:3)

假设EE_CognitivLevel_tEE_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);

等等......哦,并确保该函数位于extern“C”{}内,以便C ++编译器不会破坏名称。

答案 1 :(得分: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#中创建兼容类型。