我编写了一个使用C ++静态Lib的C#应用程序。我已经将Lib包装在.dll中,但遇到了问题。当我调用.dll函数时,我得到System.Stackoverflow
异常。
我必须使用.lib已经在其他地方使用过,我需要的解决方案能够让我从我的C#程序中与lib通信。
C#
CreateRegistryLocation(mPath);
[DllImport("Wrapper.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int CreateRegistryLocation(string key);
C ++ .dll
extern "C"
{
__declspec(dllexport) int CreateRegistryLocation(const char* key)
{
return RegistryNamespace::CreateRegistryLocation(key);
}
}
C ++ .lib
extern "C"
{
int CreateRegistryLocation(const char* key);
}
如果我从dll中删除了对lib的调用,那么dll和应用程序之间的通信似乎就像我期望的那样工作。我已经删除了.lib中的正文并使其返回0所以我不这样做相信lib函数的主体与问题有关。我没有将返回值赋给C#中的任何内容,因此我没有看到递归问题。目前代码应该只是调用exe - > Dll - > Lib和值0应该返回链。
非常感谢任何见解。
答案 0 :(得分:1)
__declspec(dllexport) int CreateRegistryLocation(const char* key)
{
return RegistryNamespace::CreateRegistryLocation(key);
}
可能的解释是此函数位于RegistryNamespace
命名空间中,因此RegistryNamespace::CreateRegistryLocation
只是一个非终止递归调用。鉴于问题中的代码,这是最合理的解释。