使用 DllImport 属性
不添加此属性时,默认为CallingConvention.WinApi(在 Windows 上默认为 StdCall,在 Windows CE.NET 上默认为 Cdecl)。此时,debug状态下,在vs2008中使用不会提示“ pInvokeStackImbalance”但10中会提示,因为08中关闭了MDA (managed debugging assistant);可关闭此提示:
- CTRL + ALT + E
- Under "Managed Debugging Assistants" uncheck PInvokeStackImbalance.
- -extern和static顺序随意
- extern “C”的使用
- DllImport的属性CharSet的使用
// testdllimport.h
#pragma once
using namespace System;
extern "C" _declspec(dllexport) int Add(int x,int y);
-----------------------------
// 这是主 DLL 文件。
#include "stdafx.h"
#include "testdllimport.h"
int Add( int x,int y )
{
return x+y;
}
extern "C" __declspec(dllexport) int Multiply(int x, int y)
{
return x * y;
}
----------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
[DllImport("test2.dll")]
public extern static int Add(int x, int y);
[DllImport("test2.dll")]
public static extern int Multiply(int x, int y);
static void Main(string[] args)
{
Console.WriteLine(Add(1, 2));
Console.ReadLine();
}
}
}
其他注意的:
1、在WIN7 64位机器上,要确保C#项目为X86,与C++ dll一致,否则会报加载dll错误,"某某dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
2、使用托管类对C++类进行封装时,在托管类中使用非托管类的