ITPub博客

首页 > Linux操作系统 > Linux操作系统 > C#网站调用C++非托管dll须知

C#网站调用C++非托管dll须知

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-05-06 15:04:11 0 删除 编辑

今天在asp.net网站中调用C++非托管dll的时候到时候出现"法加载 DLL“dllTest.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 "的错误
我是把dll放在bin目录下,后来放在与页面同一级目录下还是不行!这就让我郁闷了,因为以前在项目里调用C++ Dll 就像调用API一样把 DLL拷贝到System32下面,直接就
可以调用了,可现在做网站到时候是购买人家的空间不可能让你去写system32目录的,仔细琢磨能不能根据相对路径去调用C++ dll动态库
,试了发多方法都不行,不过后来发现几个要点:
1/ 指定绝对路径是可能调用DLL里面的方法,但最后你根本是不知道网站放哪个目录,所以这个方法肯定不考虑
   [DllImport("D:\\dllTest.dll")]
2/ 如果用类库(A)去调用 C++ DLL里面方法,然后把该项类库(A)的DLL和C++ DLL同时拷贝到网站bin目录下,保持两个DLL在同一路径下,这样也是可以的,但觉得就为了调用DLL
里的几个方法而专门写个DLL去调用,也不合适!所以后面也没考虑
3/ 还用种就是动态Load(Dll),就是先通过系统API动态去找到该 DDL组件,然后就再去调用里面方法
   [DllImport("Kernel32.dll")]
        public static extern IntPtr LoadLibrary(string lpFileName);
 
        [DllImport("Kernel32.dll")]
        public static extern bool FreeLibrary(IntPtr hModule);
 
        [DllImport("Kernel32.dll")]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

        private IntPtr myDllHandle = IntPtr.Zero;

        public Delegate GetAddress(string functionName, Type t)
        {
            if (myDllHandle != IntPtr.Zero)
            {
                IntPtr functionAddr = GetProcAddress(myDllHandle, functionName);

                if (functionAddr == IntPtr.Zero)
                    return null;
                else
                    return Marshal.GetDelegateForFunctionPointer(functionAddr, t);
            }
            else
                return null;
        }

        public LoadDll(string dllFilePath)
        {
            myDllHandle = LoadLibrary(dllFilePath);
        }

        ~LoadDll()
        {
            if (myDllHandle != IntPtr.Zero)
            {
                FreeLibrary(myDllHandle);
            }
            myDllHandle = IntPtr.Zero;
        }

4/后来发现上面这些方法要么不合理要么太繁琐,后面就发现一种方法可以
  把dllTest.dll拷贝到bin目录下,然后发布网站调用是可以的,因为发布后的网站DLL都在bin目录下与dllTest.dll同级所以是可以的
  但这种情况是如果直接到vs2005里面调试是不行的,因为调试网站是在vs自带的Web服务器里面运行的,利用的文件是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
  这个目录下的临时文件来运行的,但这里没有DLL所以调试是达不到效果的
  不过后面有个重大发现就是:如果给网站加个解决方案(*.sln),保持testDll.dll和这个sln文件在同一级目录下,在vs2005调试是可以的,但发布后是不行的

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-594314/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5315782