C#调用C++提供的dll出现的问题
运行库遇到了错误。此错误的地址为 0x79e71bd7,在线程 0x11f0 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
c++的结构为
function GetPosStatus(IP: PChar; Port: Integer; AQryGateWay: PQryGateWayInfoRet): Integer; export; stdcall;
PQryGateWayInfoRet = ^TQryGateWayInfoRet;
TQryGateWayInfoRet = packed record
BasicResponse: TBasicResponse;
RunInfo: TtagINFORUN;
DebugInfo: TtagINFODebug;
end;
TtagINFORUN = packed record
bLoginOK: Integer;
bGetFLowNoOK: Integer;
bDispInitOK: Integer;
PrivateSign: LongWord;
CtlStatus: Char;
ErrInfo: array[0..127] of char;
PosStatus: array[0..127] of Byte;
StatusBar485: Byte;
CurrDineNo: Byte;
end;
TtagINFODebug = packed record
FlowHead: LongWord;
FlowTail: LongWord;
CurrFlowNo: LongWord;
SNo: LongWord;
end;
C#为:
[DllImport("GateWayDll.dll")]
public static extern int GetPosStatus(byte[] ip,int port,ref TQryGateWayInfoRet ps);
[StructLayout(LayoutKind.Sequential)]
public struct TtagINFODebug
{
public UInt32 FlowHead;
public UInt32 FlowTail;
public UInt32 CurrFlowNo;
public UInt32 SNo;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct TQryGateWayInfoRet
{
public TBasicResponse tbRes;
public TtagINFORUN tgRun;
public TtagINFODebug tgDebug;
}
[StructLayout(LayoutKind.Sequential)]
public struct TtagINFORUN
{
public UInt16 bLoginOK;
public UInt16 bGetFLowNoOK;
public UInt16 bDispInitOK;
public UInt32 PrivateSign;
public byte CtlStatus;
[MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)]
public string ErrInfo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] PosStatus;
public byte StatusBar485;
public byte CurrDineNo;
}
[StructLayout(LayoutKind.Sequential)]
public struct TBasicResponse
{
[MarshalAs(UnmanagedType.LPTStr, SizeConst = 3)]
public string TranCode;
public UInt16 RetCode;
}
相关推荐
C#使用CLR调用C++的DLL库
在C++/CLI代码中,引入C++ DLL的头文件,并使用`#using`指令引入DLL库。然后,创建托管C++类,这些类封装了C++ DLL中的非托管代码,并提供给C#应用程序调用的接口。3.
C#调用C++的DLL时,如果涉及到传递结构体参数,可能会遇到一些问题。下面我将介绍如何解决这个问题,并提供相关的源代码和描述。
首先,在C#中定义一个与C++结构体相对应的结构体。确保结构体的字段和C++结构体的字段一一对应,并且字段的类型和顺序都正确。在C#中,我们可以通过Platform Invoke(P/Invoke)的方式调用C++的DLL函数。C#调用C++的DLL时,如果涉及到传递结构体参数,可能会遇到一些问题。现在,我们可以编写C#代码来调用C++的DLL函数,并传递结构体参数。通过以上步骤,我们就可以在C#中成功调用C++的DLL函数,并传递结构体参数了。接下来,我们需要在C#代码中声明C++DLL中要调用的函数。
c# 调用 C++ dll 传入传出参数对照表【C++ dll 类型与 C#类型对应关系】
C#调用 非托管C++ dll 传入Stringbuilder、ref string 、 ref char 等都报错,如mscorlib.dll 异常、其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏 等等,后来发现是dll 生成后一直没更新,放错位置了。。。 = =|| 不过也学习了一下编译器及类型相关的知识,整理如下: 1、 cl.exe /Gz 参数指定编译为 __stdcall 调用方式,默认为 __cdecl2、C#中的char是两个字节http://msdn.microsoft
C#引用C++动态库 dll 实例
接口声明了DLL对外提供的函数和类,而源文件实现了这些功能。在本实例中,C++DLL可能包含了一个或多个导出函数,这些函数是C#调用的关键。
CSharp调用Cpp代码完整实例.zip_C# CPP_C#中cpp_c#代码生成dll_c#调用cpp文件_c#调用c编写d
**C#调用C++ DLL**: 在C#中,我们使用`DllImport`特性来导入C++的DLL。需要提供正确的函数名称和参数类型。


