我的一个很简单的程序
由于你是引入非托管函数
你要把它声明为摸个类的静态外部成员
如
public class DLL
{
[DllImport("d:\\mydll.dll",EntryPoint="MyFunction")]
public static extern int MyFun(int i);
} private void Form1_Load(object sender, System.EventArgs e)
{
DLL.MyFun(1);
}
由于你是引入非托管函数
你要把它声明为摸个类的静态外部成员
如
public class DLL
{
[DllImport("d:\\mydll.dll",EntryPoint="MyFunction")]
public static extern int MyFun(int i);
} private void Form1_Load(object sender, System.EventArgs e)
{
DLL.MyFun(1);
}
另外,我的问题是上面提到的两者的参数类型不匹配,和entrypoint有关系吗?
/ mydll.cpp : 定义 DLL 的初始化例程。
//#include "stdafx.h"
#include "mydll.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//// CmydllAppBEGIN_MESSAGE_MAP(CmydllApp, CWinApp)
END_MESSAGE_MAP()
// CmydllApp 构造CmydllApp::CmydllApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CmydllApp 对象CmydllApp theApp;
// CmydllApp 初始化BOOL CmydllApp::InitInstance()
{
CWinApp::InitInstance(); return TRUE;
}
extern "C" int _stdcall MyFunction(int i)
{
/*CString sMsg;
sMsg.Format("参数 i=%d\n",i);
sMsg=sMsg+::AfxGetAppName();*/
AfxMessageBox("yes!");
return 0;
}
你是怎么调用的
using System;
using System.Runtime.InteropServices;public class CABFileAPI
{
[DllImport("file.dll", CharSet=CharSet.Auto)]
public static extern bool IsCabinet(string strFileFullPath);
}public class IsCABFile
{
public static void Main()
{
CABFileAPI.IsCabinet("c:\cab\myfile.cab");
}
}file.dll中:
BOOL IsCabinet(char *cabinet_fullpath)
{
……
}这样对吗?
还有file.dll中:
extern "C" BOOL _stdcall IsCabinet(char *cabinet_fullpath)
{
……
}
public static extern [MarshalAs(UnmanagedType.LPStr)] string IsCabinet(); 试试行不行,我也不是很明白,共同探讨!
[DllImport("d:\\file.dll",EntryPoint="IsCabinet")]
public static extern bool IsCabinet([MarshalAs(UnmanagedType.LPStr)] string cabinet_fullpath); 或者[DllImport("d:\\file.dll",EntryPoint="IsCabinet")]
public static extern bool IsCabinet([[MarshalAs(UnmanagedType.LPArray)] byte[] lpBuffer cabinet_fullpath); 试试行不行,我也不是很明白,共同探讨!
public static extern bool IsCabinet([MarshalAs(UnmanagedType.LPArray)] byte[] cabinet_fullpath);
BOOL IsCabinet(LPTSTR lpzCabFileName)
{
……
}
C#中:
[DllImport("d:\\cablib.dll",EntryPoint="IsCabinet")]
public static extern bool IsCabinet(
[MarshalAs(UnmanagedType.LPStr)]
string strFileFullPath);
这样也不对
哪里错了?
关注btw:发现关于DLL方面的咚咚,好像大家没有很明白的呀
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRuntimeInteropServicesDllImportAttributeClassTopic.asp或者
在C#中使用C/C++写的DLL:
http://www.csdn.net/Develop/Read_Article.asp?Id=16233