天天看点

.NET简谈互操作(二:先睹为快)

要想成功调用非托管代码我们需要一些准备工作;

1.需要知道非托管DLL文件有哪些导出函数是可以调用的,由于导出函数的方法的名称被重新整顿过了比如一个方法add(int number),整顿后为_add@4,为什么会这样我们后面进行讲解,这跟C++语法有点牵连,这里就不扯了;

2.在托管代码中定义非托管函数的申明,也就是我们.NET平台里的DLLImport特性,该对象是托管平台进行平台调用的核心对象,用它.NET引擎就知道该方法是在外部定义的;

3.用托管代码进行调用非托管方法;

下面我们就开始用VisualStudio2010进行演示,我们用Vs2010创建一个解决方案,里面包括托管与非托管两个项目;我给出非托管代码的创建图:

1:

.NET简谈互操作(二:先睹为快)

2:

.NET简谈互操作(二:先睹为快)

这样我们就创建了非托管C++的开发环境;下面我们来编写C++的代码;我拿我自己事先创建好的项目做演示;

3:

.NET简谈互操作(二:先睹为快)

我的非托管项目是Win32DLL,创建好后会有一个和项目名称一样的.cpp文件,这个是源代码文件,我们只需要在里面写点非托管操作的代码就行了;

// Win32DLL.cpp : 定义 DLL 应用程序的导出函数。

//

#include "stdafx.h"

extern "C" _declspec(dllexport) int _stdcall add(int x,int y)

{

 return x+y;

}

在文件Win32DLL.cpp文件里面我编写了一个add方法,仅仅作为演示使用;暂且我们不管他的具体语法;切换到托管代码中,我的代码如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace CSharp.Interop

    public static class InteropClass

    {

        [DllImport("Win32DLL.dll", EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

        public static extern int AddNumber(int x, int y);

    }

这样我们就可以直接调用AddNumber方法进行调用了;

namespace CSharp

    class Test1

        static void Main(string[] args)

        {

            try

            {

                int count = Interop.InteropClass.AddNumber(10, 20);

                Console.Write(count);

             }

            catch (DllNotFoundException errnot) { }

            catch (EntryPointNotFoundException errpoint) { }

        }