none
APPCRASH 问题 C++ 编程 RRS feed

  • 问题

  • 我用C# 调用了一个 C++ 写的dll ,里面主要是串口通信的方法,这个dll 还引用了别的dll 。

    我的问题是,我调用里面一个  获取版本的函数 ,其实就是返回 #define "V 12.23" 的 char* 的指针 。 调用完后,能正常显示内容,但过不了1秒 C#程序就崩溃   ,提示 APPCRASH 错误。

    请问 c++ dll 编程 在Vista环境下要注意什么。

    2009年10月28日 10:08

全部回复

  • 你的问题不在于C++,在于你的C#代码错误声明了DLL的函数类型。用p-invoke interop assistant 生成C#互操作代码之后和你现在的代码比较一下。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年10月28日 13:47
    版主
  •    非常感谢 Sheng Jiang  ,但是使用了p-invoke interop assistant 发现几个问题。

       一 p-invoke interop assistant无法导入两个以上的 C语言的dll, 我这里 是两个Dll 有依赖关系。
       二 p-invoke interop assistant将所有 char * 都翻译为IntPrt ,IntPrt是没有办法将其内容转换成System.String类型

            因为 new String(参数) 参数是没有 IntPrt类型。 如果使用UnSafe 方法我直接用char*去引用,然后用utf-8去解码可以得到
      char *中的字符串,并能在界面中显示出来,但是很奇怪,不到一秒 提示APPCRASH 错误(此错误非VS提示,是windows提示) 然后程序关闭。  
          
           在XP系统下能正常运行。 
    2009年10月29日 2:04
  •          使用IntPrt 然后将其用UnSafe方法转换成 (char*) 
      如 下面C# code

            IntPrt ip== 从Dll返回的char*

           unsafe
                {
                    char* pc = (char *)ip.ToPointer();
                    string str = new string(pc);<---------vs抛出 System.ExecutionEngineException
                    MessageBox.Show(str);
                }


          同样 如下代码

              unsafe
                {
                    char* pc = (char *)ip.ToPointer();
                    char c=  * pc ;   <---------vs抛出 System.ExecutionEngineException
                 }

           
        唯独 在 直接用 char * 去接收 c++类库的返回。
                char c = new char();
                unsafe
                {
                    char* pc = &c;

                    UnSafeClass.Get_Dll_Version(pc);<----- Get_Dll_Version  是C++类库函数。
                    string str = new string(pc);
                    var bs= System.Text.Encoding.Unicode.GetBytes(str);   <-----------char 是 utf-16类型
                    str = System.Text.Encoding.UTF8.GetString(bs);<------转换成为 utf-8类型
                    MessageBox.Show(str); <---------能正常显示出来
                }
                 <--------------执行完成。
                
                1-2秒后 系统(windwos vista )提示 APPCRASH 错误 。 (DEP 已经选择 “仅为Windows 程序和服务启用 DEP”)

                但是在 Xp下 无任何提示,完美运行。
               

    2009年10月29日 2:19