Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DLImport c#控制台应用程序导入c++;动态链接库_C#_C++_Visual Studio_Dll_Dllimport - Fatal编程技术网

DLImport c#控制台应用程序导入c++;动态链接库

DLImport c#控制台应用程序导入c++;动态链接库,c#,c++,visual-studio,dll,dllimport,C#,C++,Visual Studio,Dll,Dllimport,我很难让它工作。我用C++ DLL项目、C++控制台应用程序和C语言控制台应用程序创建了一个测试解决方案(VS2015)。 两个控制台应用程序都在其主方法中调用a DLL函数,并将结果打印到控制台。所有项目都生成到同一目录 这在C++控制台应用程序中很好,因为我只是添加了对DLL项目的引用,并包含了页眉。 在c#ConsoleApplication中,我无法实现这一点。我知道它是非托管代码,我需要使用DLLImport 当我尝试运行c#应用程序时,调用test()时会引发System.Entry

我很难让它工作。我用C++ DLL项目、C++控制台应用程序和C语言控制台应用程序创建了一个测试解决方案(VS2015)。 两个控制台应用程序都在其主方法中调用a DLL函数,并将结果打印到控制台。所有项目都生成到同一目录

<>这在C++控制台应用程序中很好,因为我只是添加了对DLL项目的引用,并包含了页眉。

在c#ConsoleApplication中,我无法实现这一点。我知道它是非托管代码,我需要使用DLLImport

当我尝试运行c#应用程序时,调用test()时会引发System.EntryPointNotFoundException。并表示无法找到入口点“测试”

那么我做错了什么

DLL.h
    #ifdef DLL_EXPORTS
    #define DLL_API __declspec(dllexport)
    #else
    #define DLL_API __declspec(dllimport)
    #endif

    DLL_API int test(void);

DLL.cpp
    #include "DLL.h"
    // This is an example of an exported function.
    DLL_API int test(void)
    {
        return 42;
    }
它编译为DLL.DLL

Programm.cs
    using System;
    using System.Runtime.InteropServices;

    namespace DLLTestCSharp
    {

        class Program
        {

            [DllImport("DLL.dll")]
            public static extern int test();

            static void Main(string[] args)
            {

                Console.WriteLine(test());

                Console.Read();
            }
        }
    }
它编译为DLLTestCSharp.exe


我认为您的问题是,当我们在c/c++中编译代码并导出函数时,根据我们使用的调用约定,导出表中有@Test0等名称。我建议您下载CffExplorer并查看dll的导出表。然后尝试用正确的名称导入.< /p> ,因为C++名称的限制,找不到入口点。它以一种特殊的唯一方式对方法名进行编码,以支持重载和模板

要禁用此行为并按原样导出方法名称,您需要使用
extern“C”
(或放入
extern“C”{}
块)标记方法,或将带有导出名称的.def文件添加到dll项目中

通常在头文件中完成:

#ifdef __cplusplus
extern "C" {
#endif

DLL_API int test();

// other functions

#ifdef __cplusplus
}
#endif
这将适用于所有平台

另一方面,Def文件主要是Windows方法。将ProjectName.def添加到解决方案中,并将导出列表放在其中:

LIBRARY <libraryname>
EXPORTS
    test
库
出口
测试

更多关于

这是因为C++名字的模糊。你需要用<代码>外部“C++”<代码>来标记你的方法,或者添加一个带有导出名称的.DEF文件到你的DLL项目。你的意思是我必须在没有API宏API宏的情况下手动地进行导出/导入吗?可以通过在
extern“C”
块中声明函数(或将
extern“C”
添加到API宏中)或在.def文件中提供导出名称来完成。非常感谢!从
DLL\u API int test(void)更改DLL.h中的方法后
外部“C”DLL\U API内部测试(无效)它编译和执行正确!但是,难道没有一种方法可以通过c#method的正确属性来实现这一点吗?Alex Skalozub-创建一个具有相同内容的答案,我会将其标记为已解决