参考链接:
最近需要进行一些混合编程实验,主要是界面使用C#设计实现,目前考虑使用WPF因为WP以及Win8开发,WPF都少不了顺便可以学习。
对于混合编程,需要注意一些细节。
- 要使用[DllImport("Win32ProjectDll.dll")]需要using System.Runtime.InteropServices;
- 需要将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>
- 要在DLL里面添加extern “C”作为申明前缀并记得更新dll放到对应debug目录下
- 貌似每次调用一个函数就需要添加[DllImport("Win32ProjectDll.dll")]否则会提示某函数没有实现
- 通常会碰到不能在DLL里面找到某函数的入口函数,通常这是由前面设置不对所造成如缺少extern “C”之类
- 如果DLL中函数拥有参数那么需要注意设置 [DllImport("Win32ProjectDll.dll", CallingConvention = CallingConvention.Cdecl)]
注意其中的callingconvention.Cdecl,VS有提示各种调用方式适合的情况,不匹配有可能出现
调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
的错误