c#调用C++ dll 报未将对象引用到设置对象的实例 的解决方案


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);
                }
                //以下载入初始
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值