您的位置:首页 > 编程语言 > C#

C# DLLImport的理解

2012-06-19 10:47 330 查看
--------------------------------------------------------------------------------------------

先不考虑概念,简单的说就是调用dll中的某个方法。以例子说明。

创建一个form,在其上添加按钮。按钮的点击事件为button1_Click(object sender, EventArgs e)。

    //struct 收集系统情况

    [StructLayout(LayoutKind.Sequential)]

    public struct SYSTEM_INFO

    {

        public uint dwOemId;

        public uint dwPageSize;

        public uint lpMinimumApplicationAddress;

        public uint lpMaximumApplicationAddress;

        public uint dwActiveProcessorMask;

        public uint dwNumberOfProcessors;

        public uint dwProcessorType;

        public uint dwAllocationGranularity;

        public uint dwProcessorLevel;

        public uint dwProcessorRevision;

    }

public partial class Form1 : Form

{

        public Form1()

        {

            InitializeComponent();

        }

        //获取系统信息

        [DllImport("kernel32")]

        static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

        private void button1_Click(object sender, EventArgs e)

        {

            SYSTEM_INFO pSI = new SYSTEM_INFO();

            GetSystemInfo(ref pSI);

        }

}

说明:

1.点击按钮的时候会发现pSI的值已经发生了变化,里面包含系统信息。

2.SYSTEM_INFO为自定义的结构体,但结构体的参数个数和参数类型要与GetSystemInfo()方法的一致。

3.DllImport的方法的必须写成static extern ,可以修饰为public等。

-------------------------------------------------------------------------------------------

        根据上面的调用方式,我们可以同样方式调用自定义的dll吗?

        首先创建一个工程Import,并有Class1

        namespace Import

        {

            public class Class1

            {

                public static string ImportMeth(string str)

                {

                    return "you are success!";

                }

            }

        }

        然后以同样方式调用,

        //自定义的dll

        [DllImport("Import")]

        public static extern string ImportMeth(string a);

        在button1_Click(object sender, EventArgs e)里追加以下代码:

        string strRet = ImportMeth("123");
        运行后发现报错"Unable to find an entry point named 'ImportMeth' in DLL 'Import'.":"",

        试着把dll引入到工程的参照中,一样报错。

        最终查出来,原来DLLImport 用于托管程序调符合DLL规范的非托管程序动态类库.如果是调用托管程序类库,直接引用就行了。
        所以我们不需要也不能DLLImport,而应该添加using Import;

        string strRet = Class1.ImportMeth("123");

        这样就可以得到结果“you are success!”了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息