C#、C++混合编程(一)

参考链接:
 
 
近需要进行一些混合编程实验,主要是界面使用C#设计实现,目前考虑使用WPF因为WP以及Win8开发,WPF都少不了顺便可以学习。
对于混合编程,需要注意一些细节。
  1. 要使用[DllImport("Win32ProjectDll.dll")]需要using System.Runtime.InteropServices; 
  2. 需要将NATIVE C++DLL放到对应的目录的Debug

    但是这样每次改动DLL都会很复杂每次都需要修改路径,

    方法1:可以在[DllImport("Win32ProjectDll.dll")]里面修改完整路径,例如:

    [DllImport("D:\\Win32ProjectDll.dll")]

    方法2:当然还有方法就是设置DLL的默认目录

    可以按如下设置dll项目,假设程序所在目录为C:\abc\abc.exe

    1、属性-》调试-》命令设为主程序 C:\abc\abc.exe

    1、属性-》调试-》工作目录设为主程序所在目录 C:\abc

    2、将dll项目设置中链接器-》常规-》输出文件改为C:\abc\XXX.dll

    设置完后就可以直接使用调试命令了。

    来自 <http://zhidao.baidu.com/question/308050511.html>

  1. 要在DLL里面添加extern C”作为申明前缀并记得更新dll放到对应debug目录下
  2. 貌似每次调用一个函数就需要添加[DllImport("Win32ProjectDll.dll")]否则会提示某函数没有实现
  3. 通常会碰到不能在DLL里面找到某函数的入口函数,通常这是由前面设置不对所造成如缺少extern C”之类
  4. 如果DLL中函数拥有参数那么需要注意设置 [DllImport("Win32ProjectDll.dll", CallingConvention = CallingConvention.Cdecl)]

    注意其中的callingconvention.Cdecl,VS有提示各种调用方式适合的情况,不匹配有可能出现

           调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配

          的错误


posted @ 2012-12-02 10:44  小兵传奇  阅读(546)  评论(0编辑  收藏  举报