zoukankan      html  css  js  c++  java
  • .net 调用C++ dll

    .net C#调用C++ dll 主要分为以下的步骤

    1、加载dll

    [DllImport("CallOtherLanguage.dll", EntryPoint = "create_prg", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    private static extern int create_prg(byte[] first_num, byte[] second_num);

    2、调用dll

    public void CallOther()
    {
        string first = "this is a ";
        byte[] byteFirst = Encoding.UTF8.GetBytes(first);
        string second = "other";
        byte[] byteSecond = Encoding.UTF8.GetBytes(second);
        int result = create_prg(byteFirst, byteSecond);
        Console.WriteLine(result);
    }

    遇到的问题

    1、调用dll时报:无法加载*.dll,找不到指定的模块

        这个主要有以下两个原因

        a、是因为对应的dll中有依赖于别的dll,用【depends】这个程式打开dll看有哪些依赖dll没有于当前dll放到同一个目录下,下载指定的dll到当前目录下即可

        b、dll依赖的dll所在的路径没有放到环境变量中,把依赖dll放到环境变量中此错误就会解决

    2、控制台程序和winform程序调用dll都能够正确返回内容,便是webform或webservice调用dll就会报错:未处理System.StackOverflowException

        这个目前了解到的原因是控制台程序和winform中单线程调用,而webform或webservice是多线程调用,可能是这方面出现的问题,以下是两个临时解决方案

        1、写一个控制台程序调用dll,然后weborm调用这个控制台程序获得返回结果

        2、把webform的请求写入数据库或队列中,然后写一个服务自动去轮询数据库或队列进行处理

    2、vs调试时调用正常,便是发布到IIS后调用失败,说找不到指定的模块:无法加载*.dll,找不到指定的模块

        这个问题主要是因为调用的dll所依赖的dll所在路径配置的环境变量是用户环境变量而不是系统环境变理,把环境变量配置到系统环境变量后问题解决

        原因是IIS使用户调取不到用户环境变量,只能调取到系统环境变量

  • 相关阅读:
    洛谷 P2294 【[HNOI2005]狡猾的商人】
    洛谷 P5960 【【模板】差分约束算法】/差分约束算法入门
    洛谷 P3916 【图的遍历】
    洛谷 P1347 【排序】
    洛谷 P3243 【[HNOI2015]菜肴制作】
    ES6,ES7,ES8,ES9,ES10新特性一览
    Sass、LESS 和 Stylus区别总结
    MyBatis更新用户信息操作
    MyBatis使用mapper映射文件删除用户信息
    MyBatis使用mapper映射文件添加用户信息
  • 原文地址:https://www.cnblogs.com/zbspace/p/11861816.html
Copyright © 2011-2022 走看看