P/invoke DLL 函数从 C++ dll 在 C# 中
P/invoke DLL functions from C++ dll in C#
我在从DLL(某些相机的SDK)调用一些函数时遇到问题。在.dll源中,有函数:
NET_SDK_API LONG CALL_METHOD NET_SDK_Login(char *sDVRIP,WORD wDVRPort,char *sUserName,char *sPassword,LPNET_SDK_DEVICEINFO lpDeviceInfo);
我正在尝试使用以下代码从 .Net 控制台应用程序调用它:
[STAThread]
static void Main(string[] args)
{
long userid = 0;
_net_sdk_deviceinfo dinfo = new _net_sdk_deviceinfo();
short port = 6036;
try
{
if (DVR.NET_SDK_Init())
{
Console.WriteLine("ok");
userid = DVR.NET_SDK_Login("192.168.1.132", port, "admin", "123456", out dinfo);
userid.ToString();
}
else
{
Console.WriteLine("err");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadKey();
}
我收到以下错误:
调用 PInvoke 函数 'DVRtest!DVRtest.DVR::NET_SDK_Login' 有 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 调用约定和 PInvoke 签名匹配的参数 目标非托管签名。
Init 通过得很好,但我无法得到其他任何东西。我尝试了十几种解决方案,但一无所获。
这是dll的来源和我的.Net应用程序的来源。 谢谢!
[编辑]
正如@david指出的那样,调用公约是错误的,现在,我得到以下错误:
运行时遇到致命错误。错误的地址 在0x6fda02c7,在线程0x2554。错误代码为0xc0000005。 此错误可能是 CLR 中的错误,也可能是不安全或不可验证的错误 部分用户代码。此错误的常见来源包括用户 COM 互操作或 PInvoke 的封送处理错误,这可能会损坏 叠。
此错误来自 DLL 还是 CLR (.Net)?我从未将任何函数从DLL导入.Net,因此非常感谢任何帮助。
从非托管源:
#define CALL_METHOD __stdcall
从托管源:
[DllImport("DVR_NET_SDK.dll", CallingConvention = CallingConvention.Cdecl)]
您的调用约定不匹配。
至于对问题的编辑,大概是因为 C# 结构定义与非托管结构不匹配。您未能正确转换任何数组。他们将需要使用[MarshalAs(UnmanagedType.ByValArray, SizeConst=...)]
.
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Python ctypes:不会按预期加载 dll
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL