.NET动态载入c++动态链接库

 1
问题描述:dll的路径必须在静态常量(const),所以是无法通过一般方法把c:\\FirstDll.dll作为变量传入的.

下面介绍的方法鉴于:http://www.cnblogs.com/wuwei2150/archive/2008/07/15/1228346.html

但原处有小处错误,余在此修改,并优化.

[DllImport("c:\\FirstDll.dll", EntryPoint="Add")]
        public static extern int Add(int a,int b);

#region 编码信息
/*
 * 开发人员:秦仕川
 * Date: 2010-6-9
 * Time: 15:57
 * 修改人员:秦仕川
 * 修改时间:
 */
#endregion
using System;
using QSMY.DynamicLoadDLLFile;
using System.Runtime.InteropServices;
namespace TestDLL
{
    class Program
    {
        delegate int AddDelegate(int a,int b);
        public static void Main(string[] args)
        {
             AddDelegate addHandler;
            DllDotNetHelper helper=new DllDotNetHelper();
            helper.LoadLibrary("c:\\FirstDll.dll");//这里就可以动态载入了
            addHandler=    (AddDelegate)helper.GetFunctionDelegateObject("Add",typeof(AddDelegate));
            int c=addHandler(4553,35665);
            Console.WriteLine(c);
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
        
    
    }

 1 #region 编码信息
 2 /*
 3  
 4  * Date: 2010-6-9
 5  * Time: 15:59
 6  * 修改人员:秦仕川
 7  * 修改时间:
 8  */
 9 #endregion
10 using System;
11 using System.Collections.Generic;
12 using System.Runtime.InteropServices;
13 
14 namespace QSMY.DynamicLoadDLLFile
15 {
16     public class DllDotNetHelper
17     {
18         private IntPtr _dllPtr=IntPtr.Zero;
19         public void LoadLibrary(string dllFileFullName){
20             _dllPtr=    LibrayHelper.LoadLibrary(dllFileFullName);
21         }
22         public void FreeLibary(){
23             if (_dllPtr!=IntPtr.Zero) {
24                 LibrayHelper.FreeLibrary(_dllPtr);
25             }
26         }
27         /// <summary>
28         /// 获取该方法的委托Object对象
29         /// </summary>
30         /// <param name="functionName">函数名</param>
31         /// <param name="t">该方法的委托类型</param>
32         /// <returns></returns>
33         public    object GetFunctionDelegateObject(string functionName,Type t)
34         {
35             int addr = LibrayHelper.GetProcAddress(_dllPtr, functionName);
36             if (addr == 0)
37                 return null;
38             else
39                 return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
40         }
41         
42     }
43 }
44 

 

posted @ 2010-06-09 17:05  [秦时明月]  阅读(823)  评论(2编辑  收藏  举报