c# 调用 C++ dll 第一次调用的时候,可以正常加载,正常返回,多次调用之后在执行完 sendMessage(b); 之后,就会报 未将对象引用到设置对象的实例,代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace CSharpDemo
{
class Program
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
public static extern IntPtr LoadLibrary(
[MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);
[DllImport("kernel32.dll", EntryPoint = "GetProcAddress", SetLastError = true)]
public static extern IntPtr GetProcAddress(IntPtr hModule,
[MarshalAs(UnmanagedType.LPStr)] string lpProcName);
[DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
public static extern bool FreeLibrary(IntPtr hModule);
public delegate int InitPrinterManager();
public delegate void _onMessage_func(IntPtr str);
public delegate void SetRecvDataCallback(_onMessage_func callback);
public delegate int SendMessage(byte[] str);
public delegate int ClosePrinterManager();
public static IntPtr hLib;
public static SendMessage sendMessage;
static void onMessage(IntPtr str)
{
byte[] buffer1 = Encoding.Default.GetBytes(Marshal.PtrToStringAnsi(str));
byte[] buffer2 = Encoding.Convert(Encoding.UTF8, Encoding.Default, buffer1, 0, buffer1.Length);
string strBuffer = Encoding.Default.GetString(buffer2, 0, buffer2.Length);
}
static void WebSocket()
{
string str = "{\"cmd\":\"print\",\"requestID\":\"123458976\",\"version\":\"1.0\"}";
byte[] b = System.Text.Encoding.UTF8.GetBytes(str);
//用于接口返回
int Res = -1;
//IntPtr hLib;
//以下动态载入dll库
if (hLib == IntPtr.Zero)
{
if (IntPtr.Size == 8) //判断版本号
hLib = LoadLibrary("PrinterManager64.dll");
else
hLib = LoadLibrary("PrinterManager32.dll");
if (hLib == IntPtr.Zero)
{
Console.WriteLine("loadlibrary failed! ErrorNuber:" + Marshal.GetLastWin32Error().ToString());
System.Threading.Thread.Sleep(2000);
System.Environment.Exit(-1);
}
//以下载入初始