程序流程:
    C#按钮响应函数:
            DLL.dll mdll = new dll();
            bool flag = mdll.Test(false);
            if (flag)
            {
                MessageBox.Show("true");
            }
            else
            {
                MessageBox.Show("flase");
            }
     C#接口:
            using System.Runtime.InteropServices;
            namespace DLL
           {
                class dll
               {
                   [DllImport("Test.dll", EntryPoint = "test")]
                   private static extern bool dll_test(bool param);                   public bool Test(bool param)
                  {
                      bool pm = dll_test(param);
                      return pm;
                   }
               }
           }
      MFC源码:
           #pragma once
           #include "stdafx.h"
           #define API extern "C" _declspec(dllexport)
           API bool test(bool param)
           {
        bool revalue = param;
                return revalue;
            }
步进调试时,MFC: revalue的值为false,但跑到C#接口后,pm的值为true,最后C#按钮里的flag值也为true。
    不管C#里按钮的param是true还是false,返回值都是true,这个问题怎么解决啊?   百度说变量类型,参数带入的问题导致dll函数调用不成功,但我这个工程里的变量类型和参数都比较简单,只有bool变量啊,而且程序也进了dll,且执行正确。搞不明白了,兄弟们指导下啊,谢谢,拜托了!!          

解决方案 »

  1.   

    真是你说的这样,确实比较怪!你先这样试试:直接把net的这个exe程序,作为mfc的外挂程序,设置断点到:
    API bool test(bool param)这个函数的入口处,在mfc这边F5调试运行!一步一步执行,看看到底发生了什么
      

  2.   

      private static extern bool dll_test(bool param);
    改成
      private static extern bool dll_test([MarshalAs(UnmanagedType.U1)]bool param);
      

  3.   

    [return: MarshalAs(UnmanagedType.U1)]
    private static extern bool dll_test([MarshalAs(UnmanagedType.U1)]bool param);
      

  4.   

    楼上是可行的!查了一下MSDN,有标准可以对应,准确的要用:[MarshalAs(UnmanagedType.I1)] !MSDN这样说明: I1 1 字节有符号整数。可使用此成员将布尔值转换为 1 字节、C 样式的 bool(true = 1、false = 0)。  造成这种现象的原因:
    不同编译器可能会将bool定义所占内存大小不一样。
    c#中缺省会认为导进来的是类似于vc中BOOL的类型,所以会是4个字节(32位机上)
    而如果在vc++中返回的是bool(仅是1个字节),当然会出错!解决的两种办法:
    1. VC中返回BOOL(或是直接返回int);
    2. 在c#中加上关键字: MarshalAs(UnmanagedType.I1);
      

  5.   

    牛人很多啊
    marshalas 不错啊。
    另外,bool 不行,就改成 int 的呗。
    int 总行吧。