无法从C#应用程序调用简单的自定义DLL导入

时间:2016-02-17 16:23:19

标签: c# c++

更新

我现在已经完成教程3次,结果相同(Visual Studio / Windows无法将DLL识别为有效文件)。这必须是我的环境的一个问题,因为下面的迈克贯穿了教程并且它工作正常。

我在上次运行的C ++项目解决方案资源管理器中注意到了这一点:

enter image description here

有谁知道这是否可以?似乎有很多红色停车标志对我来说会暗示一些不好的事情......

this教程之后,我最终得到了以下内容:

C#

using System.Runtime.InteropServices;

namespace TestImport
{
    class Program
    {
        [DllImport("TestLib.dll")]
        public static extern void DisplayHelloFromDLL();

        static void Main(string[] args)
        {
            DisplayHelloFromDLL();
        }
    }
}

C ++

.cpp档案Source Files

#include <stdio.h>

extern "C"
{
    __declspec(dllexport) void DisplayHelloFromDLL()
    {
        printf("Hello from DLL !\n");
    }
}

在Visual Studio中进行调试时:

An unhandled exception of type 'System.DllNotFoundException' occurred in TestImport.exe

Additional information: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

运行构建的EXE(来自与Dll相同的文件夹)时:

An attempt was made to load a program with an incorrect format.

我在上面的代码中做错了什么吗? 我确实在VS 2015中做了所有这些,教程需要VS 2010,但是我无法找到更新的教程。

当我尝试将项目添加为Project -> Add Reference ...的引用时,我看到了这个错误:

A reference to 'Path\To\MyLib.dll' could not be added. Please make sure 
that the file is accessible, and that it is a valid assembly or COM
component.

这让我觉得问题出在源代码或DLL配置上。

我还尝试构建这两个文件并在运行可执行文件之前将它们放在同一文件夹中,但没有任何改进的结果(与运行上面的EXE时相同的错误)。

Solution Explorer屏幕截图:

enter image description here

3 个答案:

答案 0 :(得分:1)

确保您的C ++项目名称和DllImport参数相同。另外,如果dll文件与C#项目不在同一目录中,请务必将dll添加到Debug/Release文件夹中。

另外!确保在编译时以相同的32/64位模式运行..如果使用32位编译dll并尝试在64位C#程序中使用它,它将无法正常工作。

答案 1 :(得分:0)

  

好了,现在构建这个应用程序,然后 将以前构建的DLL复制到当前应用程序的Debug / Release目录 。 DLL应与主应用程序位于同一目录中。

您是否使用粗体文字?您的C#应用​​程序将不知道在哪里查找DLL,默认情况下它会在build文件夹中查找。

答案 2 :(得分:0)

  

类型为'System.DllNotFoundException'的未处理的异常

这件事发生在我身上,因为导入了c ++ dll,所以缺少了它自己的依赖dll。

将它们复制到Debug / Release文件夹后,一切正常。