C#调用医保接口VC动态库,提示:无法加载 DLL “BargaingApplyV3_01036.dll”:找不到指定的模块,郁闷,函数名确实没有打错啊?public class Sxyb
    {
        /// <summary>
        /// 交易初始化函数
        /// </summary>
        /// <param name="strEmpty">不需要传递数据</param>
        /// <param name="strMsg">返回的信息</param>
        /// <param name="strYLJGBH">传递医疗机构编号</param>
        /// <returns>等于0:成功,没有任何警告,返回信息在retMsg,大于0:成功,但是有警告信息,警告信息在retMsg,小于0:失败,错误信息在retMsg中</returns>
        [DllImport("BargaingApplyV3_01036.dll", EntryPoint = "f_UserBargaingInit")]
        public static extern int f_UserBargaingInit(string strEmpty, string strMsg,string strYLJGBH);        /// <summary>
        /// 交易关闭函数
        /// </summary>
        /// <param name="strEmpty">不需要传递数据</param>
        /// <param name="strMsg">返回的信息</param>
        /// <param name="strYLJGBH">传递医疗机构编号</param>
        /// <returns>等于0:成功,没有任何警告,返回信息在retMsg,大于0:成功,但是有警告信息,警告信息在retMsg,小于0:失败,错误信息在retMsg中</returns>
        [DllImport("BargaingApplyV3_01036.dll", EntryPoint = "f_UserBargaingClose")]
        public static extern int f_UserBargaingClose(string strEmpty, string strMsg, string strYLJGBH);
    }
        string strEmpty = string.Empty;
        string strMsg = string.Empty;
        string strYLJGBH = "330699000081";
        int result = Sxyb.f_UserBargaingInit(strEmpty, strMsg, strYLJGBH);        
        MessageBox.Show(result.ToString() + "," + strMsg);函数原型:int f_UserBargaingInit(const char * Data1,char * retMsg,char* Data2)
功能:系统应用前初始化数据准备
参数说明:
传入参数:Data1-------不需要传递数据
Data2-------传递医疗机构编号
         retMsg ---- 返回的信息,数据包格式参考3.3
返回值:=0-----------成功,没有任何警告,返回信息在retMsg
        >0-----------成功,但是有警告信息,警告信息在retMsg
        <0-----------失败,错误信息在retMsg中

解决方案 »

  1.   

    你的问题不出在调用函数的时候,出在load dll的时候,你是如何load的?
      

  2.   

    另外按你的代码 Sxyb.f_UserBargaingInit 执行完了 strMsg 只会是 string.Empty ,f_UserBargaingInit 第二个参数类型该是 StringBuilder 。
      

  3.   

    接4楼,strMsg 定义改成 StringBuilder strMsg = new StringBuilder(512);
      

  4.   

    [DllImport("BargaingApplyV3_01036.dll"],同时把DLL复制到程序目录试看
      

  5.   

    已经放到可执行文件目录“bin\Debug”下了
      

  6.   

    用depends查看DLL的函数,会不会后面多了一些@xxxx之类的
      

  7.   

    这个 dll 运行时是否需要其他 dll 的支持?
      

  8.   

    如果是 vc 编译时没有指定 extern C 倒真有可能是函数名的问题
      

  9.   

    用depends打开该DLL文件会报错,打开另外的DLL文件有警告信息,但没有错误信息,会不会问题在这里啊,DLL本身就有问题啊
      

  10.   

    不过别人的应用程序也用同样的DLL文件就可以用,所以DLL文件出问题也是不可能的
      

  11.   

    LoadLibrary?我是用C#编程的,C#里面是用DllImport引入动态链接库的  public class Sxyb
        {
            /// <summary>
            /// 交易初始化函数
            /// </summary>
            /// <param name="strEmpty">不需要传递数据</param>
            /// <param name="strMsg">返回的信息</param>
            /// <param name="strYLJGBH">传递医疗机构编号</param>
            /// <returns>等于0:成功,没有任何警告,返回信息在retMsg,大于0:成功,但是有警告信息,警告信息在retMsg,小于0:失败,错误信息在retMsg中</returns>
            [DllImport("BargaingApplyV3_01036.dll", EntryPoint = "f_UserBargaingInit")]
            public static extern int f_UserBargaingInit(string strEmpty, string strMsg,string strYLJGBH);        /// <summary>
            /// 交易关闭函数
            /// </summary>
            /// <param name="strEmpty">不需要传递数据</param>
            /// <param name="strMsg">返回的信息</param>
            /// <param name="strYLJGBH">传递医疗机构编号</param>
            /// <returns>等于0:成功,没有任何警告,返回信息在retMsg,大于0:成功,但是有警告信息,警告信息在retMsg,小于0:失败,错误信息在retMsg中</returns>
            [DllImport("BargaingApplyV3_01036.dll", EntryPoint = "f_UserBargaingClose")]
            public static extern int f_UserBargaingClose(string strEmpty, string strMsg, string strYLJGBH);
        }
      

  12.   

    解析出三个函数名:f_UserBargaingClose,f_UserBargaingApply,f_UserBargaingInit
      

  13.   

    开发文档部分内容
    PowerBuilder中函数定义:FUNCTION integer f_UserBargaingInit(string lpData1, ref string lpMessage,string lpData2)  library "BargaingApplyV3_01011 "
      

  14.   


    dll导出函数没有问题
    保证dll与你的程序在同一个目录下
    不行就LoadLibrary+GetProcAddress
    /// Return Type: int
    public delegate int FARPROC();[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct HINSTANCE__ {
        
        /// int
        public int unused;
    }public partial class NativeMethods {
        
        /// Return Type: HMODULE->HINSTANCE->HINSTANCE__*
        ///lpFileName: LPCTSTR->LPCWSTR->WCHAR*
        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="LoadLibraryW")]
    public static extern  System.IntPtr LoadLibraryW([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPTStr)] string lpFileName) ;    
        /// Return Type: FARPROC
        ///hModule: HMODULE->HINSTANCE->HINSTANCE__*
        ///lpProcName: LPCSTR->CHAR*
        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="GetProcAddress")]
    public static extern  FARPROC GetProcAddress([System.Runtime.InteropServices.InAttribute()] System.IntPtr hModule, [System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] string lpProcName) ;}
      

  15.   

    那根据Depends工具查看的结果,里面却是是这个函数名啊,难道参数不对?
      

  16.   

    不论是公司内部开发的还是买来的,都该有开发 dll 的语言的头文件,调用示例,而不是翻译过后的方法,而且还有不少翻译错的
      

  17.   

    噢,只是别人用的也是这个DLL和开发文档,但是东西也做出来了,所以我就想着在程序上找原因了
      

  18.   

    可能是vc的调用约定不是stdcall的。
    试试别的。VC如果没有改动的话,默认是__cdecl。
    [DllImport(CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
      

  19.   

    我之前遇到过这个问题。。C#调用c++,vc的dll不一定会成功。但是调用c语言的dll是没有问题的。解决办法就是在用depengs工具看下函数前面是不是有@这样的符号在前面。如果有那这个dll的函数你调用不了