#ifdef BS2KAPI_EXPORTS
#define BS2KAPI_API __declspec(dllexport)
#else
#define BS2KAPI_API __declspec(dllimport)
#endif// This class is exported from the bs2kapi.dll
class BS2KAPI_API CBs2kapi {
public:
CBs2kapi(void);
// TODO: add your methods here.
};extern BS2KAPI_API int nBs2kapi;BS2KAPI_API int fnBs2kapi(void);#define BS2KAPIDLL __declspec(dllexport)BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
BS2KAPIDLL DWORD BS2KAPI_Close(void);
BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1); 在C++中没有问题,而在C#中这样调用
[DllImport("bs2kapi.dll")]
private static extern int BS2KAPI_Initlize();
private void button4_Click(object sender, System.EventArgs e)
{
BS2KAPI_Initlize();

}
提示找不到名为BS2KAPI_Initlize();函数的入口点,真是烦,请大侠手解答!分不够尽管说!

解决方案 »

  1.   

    我已经回答过了,先用dumpbin.exe确认你export的函数的名字,dumpbin.exe应该是在VC那个安装目录的BIN目录里
    也参考http://groups.google.com/group/microsoft.public.dotnet.framework.clr/msg/cfc623e00a8f0249?hl=en&
      

  2.   

    自己手工加载个main入口点不行吗?
    可能是export的函数的问题?
    -------------------------------
      

  3.   

    这是要加 extern "C"
      这样定义 extern "C" BS2KAPI_API int fnBs2kapi(void);
      注意 C 要大写。  微软的解释:
    ——————————————————————————————————
    主要注意包含 DllImport 的代码行。此代码行根据参数值通知编译器,使之声明位于 User32.dll 中的函数并将签名中出现的所有字符串(如参数或返回值)视为 Unicode 字符串。如果缺少 EntryPoint 参数,则默认值为函数名。另外,由于 CharSet 参数指定 Unicode,因此公共语言运行库将首先查找称为 MessageBoxW(有 W 是因为 Unicode 规范)的函数。如果运行库未找到此函数,它将根据调用约定查找 MessageBox 以及相应的修饰名。受支持的调用约定只有 __cdecl 和 __stdcall。
    当调用用户定义的 DLL 中所包含的函数时,有必要将 extern "C" 添加在 DLL 函数声明之前,如下所示:
    // The function declaration in SampleDLL.h file
    extern "C" SAMPLEDLL_API int fnSampleDLL(void);
      

  4.   

    extern "C" SAMPLEDLL_API int fnSampleDLL(void);是改C++里面的函数还是改C#里面的定义!
      

  5.   

    关键问题是DLL是别人提供的,我又不能修改!
      

  6.   

    我运行E:\Microsoft Visual Studio .NET 2003\Vc7\bin>dumpbin /export c:\bs2kapi.dll
    Microsoft (R) COFF/PE Dumper Version 7.10.3077
    Copyright (C) Microsoft Corporation.  All rights reserved.DUMPBIN : warning LNK4044: 无法识别的选项“/export”;已将其忽略Dump of file c:\bs2kapi.dllFile Type: DLL  Summary        5000 .data
            1000 .rdata
            1000 .reloc
            4000 .text
    真的是没办法了,查了好多资料,说是要改extern "C"
    可是这是别人的DLL,我又不能改!
      

  7.   

    在VC里面这样调用就成功
    #ifdef BS2KAPI_EXPORTS
    #define BS2KAPI_API __declspec(dllexport)
    #else
    #define BS2KAPI_API __declspec(dllimport)
    #endif// This class is exported from the bs2kapi.dll
    class BS2KAPI_API CBs2kapi {
    public:
    CBs2kapi(void);
    // TODO: add your methods here.
    };extern BS2KAPI_API int nBs2kapi;BS2KAPI_API int fnBs2kapi(void);#define BS2KAPIDLL __declspec(dllexport)BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
    BS2KAPIDLL DWORD BS2KAPI_Close(void);
    BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
    BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1); 
      

  8.   

    如果你没有使用DEF文件,你就在.h中这样声明
    extern "C" 
    {
    BS2KAPIDLL DWORD BS2KAPI_Initlize(void);
    BS2KAPIDLL DWORD BS2KAPI_Close(void);
    BS2KAPIDLL DWORD BS2KAPI_HaveOneLook(void);
    BS2KAPIDLL DWORD PutOneString (BYTE Type, BYTE Addr, BYTE Data3, BYTE Data2, BYTE Data1);
    }
    这样编译之后dll中的函数才是标准c方式的不然你可以用dependency看看你原来的dll,生成的函数名是
    BS2KAPI_InitializeXXXX();
    其中的XXXX是一些不确定的符号
      

  9.   

    using System.Runtime.InteropServices;[DllImport("user32.dll")]
       public static extern long ExitWindowsEx(long dwOptions, long dwReserved);