Code Bye

c# 使用LoadLibrary错误码193的问题

项目中使用WebApi(VS2013开发,AnyCPU)来实现一个接收文件的服务,
现在接收文件没有问题,但是接收文件后需要进行一些处理,
所以使用VC6写了一个Dll,想在WebApi中动态调用。
DllImport的方式不够灵活,所以使用委托,具体代码如下:
namespace webServer.Classes
{
    public class PreProcDllLoader
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr LoadLibrary(string strDllFile);
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetProcAddress(IntPtr hModule, string strProcName);
        [DllImport("kernel32.dll")]
        private static extern IntPtr FreeLibrary(IntPtr hModule);
        [DllImport("kernel32.dll")]
        private static extern int GetLastError();
        // 委托声明
        delegate bool DATAPREPROC(string strDataFile, StringBuilder strError, bool bLogEnabled, string strLogFile, int iLogLevel);
        // 预处理动态接口句柄
        private IntPtr hModule;
        // 函数地址
        private IntPtr pDataPreProc;
        // 函数接口(函数指针)
        private DATAPREPROC InDirectDataPreProc;
        // 构造函数
        public PreProcDllLoader()
        {
            hModule = IntPtr.Zero;
            pDataPreProc = IntPtr.Zero;
            InDirectDataPreProc = null;
        }
        // 析构函数
        ~PreProcDllLoader()
        {
            if (hModule != IntPtr.Zero)
                FreeLibrary(hModule);
            hModule = IntPtr.Zero;
        }
        public bool Load(String strDllFile, String strFuncName, StringBuilder strError)
        {
            String strString;
            strString = string.Empty;
            // 间接调用
            //*/
            if (!File.Exists(strDllFile))
            {
                strString = string.Empty;
                strString = string.Format("接口文件不存在!");
                strError.Clear();
                strError.Append(strString);
                return false;
            }
            if (strFuncName == string.Empty)
            {
                strString = string.Empty;
                strString = string.Format("接口函数为空!");
                strError.Clear();
                strError.Append(strString);
                return false;
            }
            try
            {
                hModule = IntPtr.Zero;
                hModule = LoadLibrary(strDllFile);
                if (hModule == IntPtr.Zero)
                {
                    strString = string.Empty;
                    strString = string.Format("加载接口失败: {0}", GetLastError());
                    strError.Clear();
                    strError.Append(strString);
                    return false;
                }
                pDataPreProc = IntPtr.Zero;
                pDataPreProc = GetProcAddress(hModule, strFuncName);
                if (pDataPreProc == IntPtr.Zero)
                {
                    strString = string.Empty;
                    strString = string.Format("加载函数失败: {0}", GetLastError());
                    strError.Clear();
                    strError.Append(strString);
                    return false;
                }
                InDirectDataPreProc = null;
                InDirectDataPreProc = (Delegate)Marshal.GetDelegateForFunctionPointer(pDataPreProc, typeof(DATAPREPROC)) as DATAPREPROC;
                if (InDirectDataPreProc == null)
                {
                    strString = string.Empty;
                    strString = string.Format("委托函数失败!");
                    strError.Clear();
                    strError.Append(strString);
                    return false;
                }
            }
            catch (Exception ex)
            {
                strString = string.Empty;
                strString = string.Format("发生异常: {0}", ex.Message);
                strError.Clear();
                strError.Append(strString);
                return false;
            }
            //*/
            return true;
        }
        public bool ExecuteFunction(string strDataFile, StringBuilder strError, bool bLogEnabled, string strLogFile, int iLogLevel)
        {
            string strString;
            strString = string.Empty;
            try
            {
                //*/
                if (InDirectDataPreProc == null)
                {
                    strString = string.Empty;
                    strString = string.Format("未加载接口!");
                    strError.Clear();
                    strError.Append(strString);
                    return false;
                }
                return InDirectDataPreProc(strDataFile, strError, bLogEnabled, strLogFile, iLogLevel);
                //*/
            }
            catch (Exception ex)
            {
                strString = string.Empty;
                strString = string.Format("发生异常: {0}", ex.Message);
                strError.Clear();
                strError.Append(strString);
                return false;
            }
        }
        public void Free()
        {
            if (hModule != IntPtr.Zero)
                FreeLibrary(hModule);
            hModule = IntPtr.Zero;
        }
    }
}

在开发环境中(PC1,Win7x64,安装了VC6和VS2013,.NetFx4.5)使用没有任何问题,不管是接收文件还是Load库进行处理;
在另一个环境(PC2,Win7x32,安装了VC6和VS2010,.NetFx4.0)也没有问题。
在生产环境中(PC3,Win7x64,只安装了.NetFx4.0),只能接收文件,LoadLibrary失败,GetLastError得到的错误码193.
不知道为什么?
只有25分了。

解决方案

10

把 AnyCPU 改成 x86 试试。

15

引用 5 楼 linchang_3344 的回复:
Quote: 引用 3 楼 shingoscar 的回复:

同一个环境里,假如c++能加在,但c#不能,最大的可能就是编译时候的架构搞错了

本人也觉得很可能是这个问题,但是实际上是本人在PC1和PC2中进行加载都是OK的
PC1,PC2,PC3都是Win7x64的系统,而WebApi又是AnyCPU的,应该是没问题的。
该怎么考虑PC1,PC2可以加载而PC3无法加载的情况呢

1、别用AnyCPU,改成和dll同样的
2、不一定是这个dll,假设你还依赖b.dll,碰巧系统里只有一种,也会出这个错误


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c# 使用LoadLibrary错误码193的问题