调用使用静态库的 dll 时出现 Stackoverflow 异常
Stackoverflow exception when calling dll which uses a static lib
我正在编写一个使用 C++ 静态库的 C# 应用程序。我已将 Lib 包装在 .dll 中,但 运行 出现了问题。当我调用 .dll 函数时,出现 System.Whosebug
异常。
我必须使用 .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 和应用程序之间的通信似乎可以正常工作,因为我 expect.I 已经删除了 .lib 中的主体并使它只是 return 0 所以我不认为 lib 函数的主体与问题相关。我没有将 returned 值分配给 C# 中的任何内容,因此我看不到任何递归问题。目前代码应该只是调用 exe -> Dll -> Lib 并且值 0 应该 return 备份链。
任何见解将不胜感激。
__declspec(dllexport) int CreateRegistryLocation(const char* key)
{
return RegistryNamespace::CreateRegistryLocation(key);
}
可能的解释是此函数位于 RegistryNamespace
命名空间中,因此 RegistryNamespace::CreateRegistryLocation
只是一个非终止递归调用。鉴于问题中的代码,这是最合理的解释。
我正在编写一个使用 C++ 静态库的 C# 应用程序。我已将 Lib 包装在 .dll 中,但 运行 出现了问题。当我调用 .dll 函数时,出现 System.Whosebug
异常。
我必须使用 .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 和应用程序之间的通信似乎可以正常工作,因为我 expect.I 已经删除了 .lib 中的主体并使它只是 return 0 所以我不认为 lib 函数的主体与问题相关。我没有将 returned 值分配给 C# 中的任何内容,因此我看不到任何递归问题。目前代码应该只是调用 exe -> Dll -> Lib 并且值 0 应该 return 备份链。
任何见解将不胜感激。
__declspec(dllexport) int CreateRegistryLocation(const char* key)
{
return RegistryNamespace::CreateRegistryLocation(key);
}
可能的解释是此函数位于 RegistryNamespace
命名空间中,因此 RegistryNamespace::CreateRegistryLocation
只是一个非终止递归调用。鉴于问题中的代码,这是最合理的解释。