大家好,我在C#中调用某些C++dll的方法总是返回true,但是我自己写了一个简单调用例子倒是很正常。
请问一下,为什么会出现这种情况?在不能改变改C++dll代码的情况下,如何解决?

解决方案 »

  1.   

    ...某些C++dll的方法...是哪些?
      

  2.   

    是我们自己开发的dll,但是尽量不修改该dll源代码。
      

  3.   


    它们该返回true就返回true,有什么不对的?
      

  4.   


    我同样还写了一个C++调用该dll方法的程序,某些情况下会返回false的。
    但是C#调用该dll方法,无论什么情况下都会返回true。
      

  5.   

    如果是非托管的,就用DllImport,举例 
      using System; 
      using System.Runtime.InteropServices; 
      class MainApp 
          [DllImport("Kernel32")]                    //读取动态库文件 
            public static extern int GetProcAddress(int handle, String funcname);   给你讲一下我的经验: 
      首先 你在C#中调用的 是C++ 写的一个动态库。比如Kernel32.dll 中的 函数; 
      这个函数用C++写 有如下要求: 
    1、 必须为全局函数 
    2、 函数参数 必须为基本类型,也就是C++ 和C#都有的类型,否则你在public static extern int GetProcAddress(int handle, String funcname); 
        这里没有办法声明。 其余的 没什么了; 还有你可以参考这里:http://blog.csdn.net/jingshuaizh/archive/2009/02/04/3862019.aspx
      

  6.   


    那还需要哪些具体信息,我尽量补充吧,谢谢:)
    被调用的dll源代码我是没有办法得到的,因为我没有权限,但是我现在的情况就是,C#调用该dll的方法,在应该返回false的情况下它总是返回true,我改用int去接收返回值,发现这个int值很大,好像是9万多吧,不是一般的0或1,但是用C++调用就很正常,用int去接收返回值得到的也就是0或1两种情况。
      

  7.   

    已经解决,函数定义加上[return:MarshalAs(UnmanagedType.I1)]
    如下:[DllImport("Hello.dll", EntryPoint = "Hello")]
    [return:MarshalAs(UnmanagedType.I1)]
    public static extern bool Hello();具体讨论看这里
    http://www.codecomments.com/archive371-2005-3-441332.html
      

  8.   

    默认的P/Invoke对int的封送平白直了,一般不会出什么问题。
    你要做的是找出C++和C#调用的不同,包括初始化和调用循序。
      

  9.   

    你的问题主要就是平台调用过程中的数据封送问题。楼上有人已经给出了正确的答案。但是如果只获得答案,不知道原理,以后遇到了此类问题还是不知道如何下手。如果你想系统学习如何进行数据封送,我推荐你阅读刚刚出版的新书:《精通.NET互操作P/Invoke,C++Interop和COM Interop》,这本书的第2章“数据封送”详细介绍了平台调用中的数据封送过程,非常详细,我就是读完后才搞清楚平台调用中的封送处理。 
    该书的官方网站: 
    www.interop123.com 豆瓣网信息: 
    http://www.douban.com/subject/3671497/ 
      

  10.   

    C#和C++的bool类型长度不同,问题解决方法:C#里面函数返回类型用byte