我的一个很简单的程序
由于你是引入非托管函数
你要把它声明为摸个类的静态外部成员

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);
}

解决方案 »

  1.   

    没有,什么是entrypoint,是不是就是dll中的“main()”?
    另外,我的问题是上面提到的两者的参数类型不匹配,和entrypoint有关系吗?
      

  2.   

    不是的 就是EntryPoint="MyFunction"
    / 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;
    }
      

  3.   

    char*对应的是string啊
    你是怎么调用的
      

  4.   

    C#中:
    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)
    {
        ……
    }这样对吗?
      

  5.   

    [DllImport("d:\\file.dll",EntryPoint="IsCabinet")]试试 
    还有file.dll中:
    extern "C" BOOL _stdcall IsCabinet(char *cabinet_fullpath)
    {
        ……
    }
      

  6.   

    [DllImport("d:\\file.dll",EntryPoint="IsCabinet")] 
    public static extern [MarshalAs(UnmanagedType.LPStr)] string IsCabinet(); 试试行不行,我也不是很明白,共同探讨!
      

  7.   

    刚才写错了,试试这个
    [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); 试试行不行,我也不是很明白,共同探讨!
      

  8.   

    今天怎么了又写错了[DllImport("d:\\file.dll",EntryPoint="IsCabinet")] 
    public static extern bool IsCabinet([MarshalAs(UnmanagedType.LPArray)] byte[]  cabinet_fullpath);
      

  9.   

    cablib.dll中:
    BOOL IsCabinet(LPTSTR lpzCabFileName)
    {
        ……
    }
    C#中:
    [DllImport("d:\\cablib.dll",EntryPoint="IsCabinet")] 
    public static extern bool IsCabinet(
    [MarshalAs(UnmanagedType.LPStr)]
    string strFileFullPath);
    这样也不对
    哪里错了?
      

  10.   

    继续顶
    关注btw:发现关于DLL方面的咚咚,好像大家没有很明白的呀
      

  11.   

    DllImportAttribute Class:
    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