当前位置: 代码迷 >> C# >> 调C++导出的dll中的方法,替嘛已经执行了dll中的方法却得不到任何返回值
  详细解决方案

调C++导出的dll中的方法,替嘛已经执行了dll中的方法却得不到任何返回值

热度:284   发布时间:2016-05-05 02:50:37.0
调C++导出的dll中的方法,为嘛已经执行了dll中的方法却得不到任何返回值?
别人C++函数声明头文件中的源码为:

SDK_API int CALLTYPE  Setup(int nWidth, int nHeight, BOOL bVideoLPR);
SDK_API HANLDE CALLTYPE OpenEx(const char *  pstrIP,  WORD  wPort,  const char *  pstrUserName,  const char *  pstrPassword, int nChannel, HWND hWnd);


我测试调用dll中的方法代码:

    {
        [DllImport("SDK.dll")]
        public static extern int Setup(int nWidth = 1280, int nHeight = 1024, bool bVideoLPR = true);

        [DllImport("SDK.dll")]
        public static extern OpenEx(string pstrIP, UInt16 wPort, string pstrUserName, string pstrPassword, int nChannel, IntPtr hWnd);

        static void Main(string[] args)
        {
            try
            {
                int rs1 = Setup();
                UInt16 wPort = 6002;
                IntPtr hWnd = (IntPtr)1;
                var rs2 = OpenEx("192.168.1.4", wPort, "admin", "******", 1, hWnd);

                string a = "123";
                a = a + 1;
            }
            catch(Exception ex)
            {

            }
            Console.ReadKey();
        }


你们看我截图,“监控”里面,我程序都走到"a=a+1"这一步了,为何rs1和rs2这两个变量,怎么跟没执行到这一步似得没值呢?还是我调用的方法不对?调用非托管的dll的方法不是这样写么? 

------解决思路----------------------
如果你想通过调试看到rs1和rs2的值,这样做是不可能的,每个对象都有自己的生命周期,你在声明rs1并给它赋值后,只能到下一条语句去调试看它的值,而之后的语句并没有引用rs1,所以它的生命周期已经结束了,处于等待GC回收的状态,调试器是不可能获取到它的值的,rs2同理。
如果非要在调试中监视它们,可以在Main函数外声明它们:private static int rs1, rs2;   或是在后面的语句引用它们。
------解决思路----------------------
rs1和rs2是栈变量,后面没有使用,系统自动清空
  相关解决方案