C# 中静态调用C++dll 和C# 中动态调用C++dll

C# 中静态调用C++dll 和C# 中动态调用C++dll

在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能反编译。这样一来,就涉及C#托管代码与C++非托管代码互相调用,于是调查了一些资料,顺便与大家分享一下:

一. C# 中静态调用C++动态链接

1. 建立VC工程CppDemo,建立的时候选择Win32 Console(dll),选择Dll。

2. 在DllDemo.cpp文件中添加这些代码。

Code
extern "C" __declspec(dllexport) int Add(int a,int b)
{
    
     return a+b;
}

3. 编译工程。

4. 建立新的C#工程,选择Console应用程序,建立测试程序InteropDemo
    5. 在Program.cs中添加引用:using System.Runtime.InteropServices;

6. 在pulic class Program添加如下代码:

Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace InteropDemo
{
    class Program
    {
        [DllImport("CppDemo.dll", EntryPoint = "Add", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
        public static extern int Add(int a, int b); //DllImport请参照MSDN

static void Main(string[] args)
        {
            Console.WriteLine(Add(1, 2));
            Console.Read();
        }
    }
}

好了,现在您可以测试Add程序了,是不是可以在C# 中调用C++动态链接了,当然这是静态调用,需要将CppDemo编译生成的Dll放在DllDemo程序的Bin目录下

二. C# 中动态调用C++动态链接

在第一节中,讲了静态调用C++动态链接,由于Dll路径的限制,使用的不是很方便,C#中我们经常通过配置动态的调用托管Dll,例如常用的一些设计模式:Abstract Factory, Provider, Strategy模式等等,那么是不是也可以这样动态调用C++动态链接呢?只要您还记得在C++中,通过LoadLibrary, GetProcess, FreeLibrary这几个函数是可以动态调用动态链接的(它们包含在kernel32.dll中),那么问题迎刃而解了,下面我们一步一步实验

1.  将kernel32中的几个方法封装成本地调用类NativeMethod

Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace InteropDemo
{
    public static class NativeMethod
    {
        [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
        public static extern int LoadLibrary(
            [MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
        public static extern IntPtr GetProcAddress(int hModule,
            [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

[DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
        public static extern bool FreeLibrary(int hModule);
    }
}

2. 使用NativeMethod类动态读取C++Dll,获得函数指针,并且将指针封装成C#中的委托。原因很简单,C#中已经不能使用指针了,如下         
            int hModule = NativeMethod.LoadLibrary(@"c:"CppDemo.dll");

IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "Add");

详细请参见代码

Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace InteropDemo
{
    class Program
    {
        //[DllImport("CppDemo.dll", EntryPoint = "Add", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
        //public static extern int Add(int a, int b); //DllImport请参照MSDN

static void Main(string[] args)
        {
            //1. 动态加载C++ Dll
            int hModule = NativeMethod.LoadLibrary(@"c:\CppDemo.dll");
            if (hModule == 0) return;

//2. 读取函数指针
            IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "Add");

//3. 将函数指针封装成委托
            Add addFunction = (Add)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(Add));

//4. 测试
            Console.WriteLine(addFunction(1, 2));
            Console.Read();
        }

/// <summary>
        /// 函数指针
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        delegate int Add(int a, int b);

}
}

通过如上两个例子,我们可以在C#中动态或者静态的调用C++写的代码了.

转自:http://www.cnblogs.com/Jianchidaodi/archive/2009/03/09/1407270.html

时间: 2024-10-09 15:44:53

C# 中静态调用C++dll 和C# 中动态调用C++dll的相关文章

在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll

  调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton;

Delphi Dll 动态调用例子(3)-仔细看一下

http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ Delphi 动态链接库的动态和静态调用 为了让人能快速的理解 静态调用.动态调用,现在做一个函数封装在一个DLL中,然后在APPLICATION form里面调用这个函数,这个函数处理两个数的和.用代码和图片说话:代码如下 library Project1; { Important note about DLL memory management: ShareMe

C#动态调用C++编写的DLL函数

C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C#中使用这三个函数. [DllImport("Kernel32")] public static extern int GetProcAddress(int handle, String funcname); [DllImport("Kernel32")] public

动态调用WebService(C#)

通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名.参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制.如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译.在某些情况下,这可能是不能忍受的,我们需要动态调用WebService的能力.比如我们可以把Web服务的URL保存在配置文件中,这样,当服

动态调用WebService接口的几种方式

一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过来就行调用的,步骤如下: 1.找到引用,右击添加服务引用,找到高级,添加web引用,添加之后就可以直接调用里面的方法. 以上这种方法是最简单粗暴的一种方式.当然在开发中总是不那么如意,以上方式是在本机直接可以访问服务的地址,假如在本机不能直接访问WebService,那么就会有些蛋疼. 这种方式就不可取了

http请求POST和GET调用接口以及反射动态调用Webservices类

此代码是API.WebSrvices动态调用的类,做接口调用时很实用. Webservices动态调用使用反射的方式很大的缺点是效率低,若有更好的动态调用webservices方法,望各位仁兄不吝贴上代码. using System; using System.IO; using System.Net; using System.Text; using System.Web; using System.Collections.Generic; using System.CodeDom.Compi

# 中静态调用C++dll 和C# 中动态调用C++dll

C# 中静态调用C++dll 和C# 中动态调用C++dll 在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能反编译.这样一来,就涉及C#托管代码与C++非托管代码互相调用,于是调查了一些资料,顺便与大家分享一下: 一. C# 中静态调用C++动态链接 1. 建立VC工程CppDemo,建立的时候选择Win32 Console(dll),选择Dl

windows中静态库lib和动态dll的区别及使用方法

1. 静态库lib和动态dll的区别 1.1 项目类型 VS在建Win32项目时,有以下选项: windows应用程序控制台应用程序DLL静态库最后两个类型:DLL和静态库,这两种项目类型是不可以单独运行的,必须在Windows应用程序调用他们执行,是提供的库函数而已. 1.2 两种lib的区别: (1)静态库(.lib) 函数和数据被编译进一个二进制文件(通常扩展名为.LIB).在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建

MFC动态调用dll到指定的进程中(win7系统vs2013环境下)

一.主程序 1.新建一个MFC项目,类型选择基于对话框 2.写一个简单的窗体 点击启动事件 MessageBox(L"调用Dll到程序中成功."); 二.要调用的Dll 1.新建一个win32dll 选择dll.勾选导出符号 1.生成Dll项目 此时会在主程序Main的debug文件夹中生成了Dll.dll和Dll.lib文件 三.配置主程序Main的属性 1.选择链接器--输入--附加依赖项:Dll.lib 1.选择连接器--输入--常规--附加库目录:..\Debug 1.包含头文