我有一个用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#中调用此函数?
非常感谢!
答案 0 :(得分: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);
等等......哦,并确保该函数位于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#中创建兼容类型。