iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Visual Studio 2010如何调用非C#编写的DLL文件
  • 917
分享到

Visual Studio 2010如何调用非C#编写的DLL文件

2023-06-17 13:06:54 917人浏览 薄情痞子
摘要

这篇文章主要介绍“Visual Studio 2010如何调用非C#编写的DLL文件”,在日常操作中,相信很多人在Visual Studio 2010如何调用非C#编写的DLL文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法

这篇文章主要介绍“Visual Studio 2010如何调用非C#编写的DLL文件”,在日常操作中,相信很多人在Visual Studio 2010如何调用非C#编写的DLL文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Visual Studio 2010如何调用非C#编写的DLL文件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

背景

项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。

步骤

创建一个CSharpInvokeCPP的解决方案:

Visual Studio 2010如何调用非C#编写的DLL文件

创建一个c++的动态库项目:

Visual Studio 2010如何调用非C#编写的DLL文件

在应用程序设置中,选择“DLL”,其他按照默认选项:

Visual Studio 2010如何调用非C#编写的DLL文件

***点击完成,得到如图所示项目:

Visual Studio 2010如何调用非C#编写的DLL文件

我们可以看到这里有一些文件,其中dllmain.cpp作为定义DLL应用程序的入口点,它的作用跟exe文件有个main或者WinMain入口函数是一样的,它就是作为DLL的一个入口函数,实际上它是个可选的文件。它是在静态链接时或动态链接时调用LoadLibrary和FreeLibrary时都会被调用。详细内容可以参考(Http://blog.csdn.net/benkaoya/arcHive/2008/06/02/2504781.aspx)。

现在我们打开CSharpInvokeCPP.CPPDemo.cpp文件:

现在我们加入以下内容:

// CSharpInvokeCPP.CPPDemo.cpp : 定义 DLL 应用程序的导出函数。    //   #include "stdafx.h"    extern "C" __declspec(dllexport) int Add(int x, int y)    {    return x + y;   }    extern "C" __declspec(dllexport) int Sub(int x, int y)    {    return x - y;    }    extern "C" __declspec(dllexport) int Multiply(int x, int y)   {    return x * y;   }    extern "C" __declspec(dllexport) int Divide(int x, int y)    {   return x / y;   }

extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

__declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。

编译项目程序,***在Debug目录生成CSharpInvokeCPP.CPPDemo.dll和CSharpInvokeCPP.CPPDemo.lib

Visual Studio 2010如何调用非C#编写的DLL文件

我们用反编译工具PE Explorer查看下该DLL里面的方法:

Visual Studio 2010如何调用非C#编写的DLL文件

可以发现对外的公共函数上包含这四种“加减乘除”方法。

现在来演示下如何利用C#项目来调用非托管C++的DLL,首先创建C#控制台应用程序:

Visual Studio 2010如何调用非C#编写的DLL文件

在CSharpInvokeCSharp.CSharpDemo项目上新建一个CPPDLL类,编写以下代码:

 public class CPPDLL    {    [DllImport("CSharpInvokeCPP.CPPDemo.dll")]   public static extern int Add(int x, int y);    [DllImport("CSharpInvokeCPP.CPPDemo.dll")]   public static extern int Sub(int x, int y);   [DllImport("CSharpInvokeCPP.CPPDemo.dll")]    public static extern int Multiply(int x, int y);   [DllImport("CSharpInvokeCPP.CPPDemo.dll")]    public static extern int Divide(int x, int y);    }

DllImport作为C#中对C++的DLL类的导入入口特征,并通过static extern对extern “C”进行对应。

另外,记得把CPPDemo中生成的DLL文件拷贝到CSharpDemo的bin目录下,你也可以通过设置【项目属性】->【配置属性】->【常规】中的输出目录:

Visual Studio 2010如何调用非C#编写的DLL文件

这样编译项目后,生成的文件就自动输出到CSharpDemo中了。

然后在Main入口编写测试代码:

 static void Main(string[] args)   {    int result = CPPDLL.Add(10, 20);    Console.WriteLine("10 + 20 = {0}", result);   result = CPPDLL.Sub(30, 12);    Console.WriteLine("30 - 12 = {0}", result);   result = CPPDLL.Multiply(5, 4);    Console.WriteLine("5 * 4 = {0}", result);    result = CPPDLL.Divide(30, 5);    Console.WriteLine("30 / 5 = {0}", result);    Console.ReadLine();    }

运行结果:

Visual Studio 2010如何调用非C#编写的DLL文件

方法得到调用。

以上的方法只能通过静态方法对于C++中的函数进行调用。那么怎样通过静态方法去调用C++中一个类对象中的方法呢?现在我在CPPDemo项目中添加一个头文件userinfo.h:

 class UserInfo {   private:   char* m_Name;    int m_Age;    public:   UserInfo(char* name, int age)    {    m_Name = name;    m_Age = age;    }    virtual ~UserInfo(){ }   int GetAge() { return m_Age; }   char* GetName() { return m_Name; }    };

在CSharpInvokeCPP.CPPDemo.cpp中,添加一些代码:

 #include "malloc.h"    #include "userinfo.h"   typedef struct {   char name[32];    int age;   } User;    UserInfo* userInfo;   extern "C" __declspec(dllexport) User* Create(char* name, int age)    {    User* user = (User*)malloc(sizeof(User));    userInfo = new UserInfo(name, age);   strcpy(user->name, userInfo->GetName());    user->age = userInfo->GetAge();   return user;    }

这里声明一个结构,包括name和age,这个结构是用于和C#方面的结构作个映射。

注意:代码中的User*是个指针,返回也是一个对象指针,这样做为了防止方法作用域结束后的局部变量的释放。

strcpy是个复制char数组的函数。

在CSharpDemo项目中CPPDLL类中补充代码:

[DllImport("CSharpInvokeCPP.CPPDemo.dll")]   public static extern IntPtr Create(string name, int age);    [StructLayout(LayoutKind.Sequential)]    public struct User    {   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]   public string Name;   public int Age;    }

其中这里的结构User就和C++中的User对应。

在Program.cs中补充代码:

 IntPtr ptr = CPPDLL.Create("李平", 27);    <STRONG><FONT color=#ff0000>CPPDLL.User user = (CPPDLL.User)Marshal.PtrToStructure(ptr, typeof(CPPDLL.User));</FONT></STRONG>   Console.WriteLine("Name: {0}, Age: {1}", user.Name, user.Age);

注意:红色字体部分,这里结构指针首先转换成IntPtr句柄,然后通过Marshal.PtrToStructrue转换成你所需要的结构。

运行结果:

Visual Studio 2010如何调用非C#编写的DLL文件

到此,关于“Visual Studio 2010如何调用非C#编写的DLL文件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Visual Studio 2010如何调用非C#编写的DLL文件

本文链接: https://www.lsjlt.com/news/289439.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Visual Studio 2010如何调用非C#编写的DLL文件
    这篇文章主要介绍“Visual Studio 2010如何调用非C#编写的DLL文件”,在日常操作中,相信很多人在Visual Studio 2010如何调用非C#编写的DLL文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-17
  • C++ Builder如何调用Visual C++ DLL
    C++ Builder如何调用Visual C++ DLL,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用C++Builder调用Visual C++ DLL 创建的DL...
    99+
    2023-06-17
  • python调用易语言编写的dll文件
     目前易语言编写的dll文件都是32位的dll,所以必须用32位的python去调用。     32位的dll必须用32位的python调用,64位的dll必须用64位的python调用。 原因如下:     在64位的windows系统...
    99+
    2023-01-31
    文件 易语言 python
  • Java如何调用dll文件
    这篇文章主要介绍Java如何调用dll文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java调用dll文件近期根据C++做了一个图片质量检测的项目,目前需要在在java中进行调用,所以先在C++上生成dll文件,...
    99+
    2023-06-29
  • Visual Studio 2022使用MinGW来编译调试C/C++程序的图文教程
    目录一、创建项目二、配置CMake三、配置调试Visual Studio的新版本已经可以像VSCode一样创建CMake项目了,但是默认的情况下是使用的Visual Studio编译...
    99+
    2022-11-13
    Visual Studio 2022调试C/C++程序 Visual Studio 2022 C++程序
  • c#如何调用c++的DLL
    这篇文章主要讲解了“c#如何调用c++的DLL”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c#如何调用c++的DLL”吧!C#是托管型代码,创建的对象会自动回收。C++是非托管型代码,创建...
    99+
    2023-06-30
  • Visual Studio Code 配置C、C++ 文件debug调试环境的详细过程
    目录vscodeC/C++ExtensionPack插件安装vscodewindows端debug配置windowMinGW环境安装windows端C、CPP单文件debug调试代码...
    99+
    2024-04-02
  • Java如何使用字符流读写非文本文件
    目录使用字符流读取文件(非文本)Base64编码base64编码简介编码规则编码方式的缺点Base64在 Java 里的应用将图片转为Base64字符串进行读写字符串转base64编...
    99+
    2023-05-15
    Java字符流 字符流读写非文本
  • 如何使用V8编写C++插件
    本篇内容介绍了“如何使用V8编写C++插件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写个测试例子const { De...
    99+
    2023-06-15
  • RPM 的 spec文件如何编写
    这篇文章给大家介绍RPM 的 spec文件如何编写,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。这里深入研究了 spec 文件,该文件中包含了有关如何构建 RPM 的指令。了解源代码在开始编写 spec 文件之前,你需...
    99+
    2023-06-05
  • 如何使用C#读写文本文件
    这篇文章将为大家详细讲解有关如何使用C#读写文本文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。读取txt文件 如果你要读取的文件内容不是很多,可以使用 File.ReadAllText(...
    99+
    2023-06-15
  • pycharm编写的文件如何执行
    在 pycharm 中执行文件的方法如下:创建或打开一个 python 文件。配置运行配置,指定文件路径和命令行参数。通过运行按钮或快捷键运行文件。在“run”工具窗口中查看执行输出。 ...
    99+
    2024-04-19
    python macos pycharm
  • C#调用动态unlha32.dll解压Lha后缀的打包文件分享
    复制代码 代码如下:public class LhaUtity    {      &nbs...
    99+
    2022-11-15
    C# unlha32.dll Lha
  • 如何进行C++代码的文档编写?
    如何进行C++代码的文档编写?在软件开发的过程中,良好的文档编写是非常重要的一环。它不仅能够帮助开发人员更好地理解和使用代码,还可以提高代码的可维护性和可读性。本文将介绍如何进行C++代码的文档编写。注释在C++代码中,注释是最常见的文档形...
    99+
    2023-11-02
    代码 文档 关键词:C++
  • C++如何调用已经写好的C接口
    目录1、C++调用C文件2、原因分析3、解决调用失败问题4、思考:那C语言能够调用C接口吗5、C接口既能被C++调用又能被C调用前言: 如何在C++代码中调用写好的C接口?...
    99+
    2024-04-02
  • Vue中的非单文件组件如何使用
    本篇内容介绍了“Vue中的非单文件组件如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一,什么是组件实现应用中局部功能代和资源的集合(...
    99+
    2023-07-05
  • 如何利用Python编写Django文件中的算法?
    Python是一种高级编程语言,Django是一个基于Python的Web框架。Django框架提供了一些强大的工具和库,可以帮助开发者快速搭建Web应用程序。在这篇文章中,我们将探讨如何使用Python编写Django文件中的算法。 一、...
    99+
    2023-06-21
    文件 django 编程算法
  • 如何通过C++编写一个简单的文件加密程序?
    如何通过C++编写一个简单的文件加密程序?导语:随着互联网的发展和智能设备的普及,保护个人资料和敏感信息的重要性越来越显著。为了确保文件的安全性,常常需要对其进行加密。本文将介绍如何使用C++编写一个简单的文件加密程序,以保护你的文件免受未...
    99+
    2023-11-03
    简单程序 文件加密 C++编程
  • C#反射调用dll文件中的方法操作泛型与属性字段
    一、使用方法 查找DLL文件,通过Reflection反射类库里的各种方法来操作dll文件 二、步骤 加载DLL文件 Assembly assembly1 = Assembly.Lo...
    99+
    2024-04-02
  • 如何编写ajax的定时调用每5秒调用一次
    本篇内容介绍了“如何编写ajax的定时调用每5秒调用一次”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!复制...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作