无法导入c++;使用DllImport将dll连接到c#项目

无法导入c++;使用DllImport将dll连接到c#项目,c#,c++,dllimport,dllexport,dllnotfoundexception,C#,C++,Dllimport,Dllexport,Dllnotfoundexception,我试图将C++项目DLL导入到C语言项目中。我发现很多人都在谈论使用DllImport。我试过用它,这是我的- CPP代码: int __declspec(dllexport) beginCode(double reportId); [DllImport("C:\\Users\\<my_user_id>\\Desktop\\ctxmix\\Release\\ctxmix.dll",CallingConvention =CallingConvention.Cdecl ,CharSet

我试图将C++项目DLL导入到C语言项目中。我发现很多人都在谈论使用DllImport。我试过用它,这是我的-

CPP代码:

int __declspec(dllexport) beginCode(double reportId);
[DllImport("C:\\Users\\<my_user_id>\\Desktop\\ctxmix\\Release\\ctxmix.dll",CallingConvention =CallingConvention.Cdecl ,CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int beginCode(double reportId);
int result = beginCode(reportId);
C#代码:

int __declspec(dllexport) beginCode(double reportId);
[DllImport("C:\\Users\\<my_user_id>\\Desktop\\ctxmix\\Release\\ctxmix.dll",CallingConvention =CallingConvention.Cdecl ,CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int beginCode(double reportId);
int result = beginCode(reportId);
[DllImport(“C:\\Users\\\\Desktop\\ctxmix\\Release\\ctxmix.dll”,CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Ansi,SetLastError=true,ExactSpelling=true)]
公共静态外部int beginCode(双报告ID);
int result=beginCode(reportId);
但是当我运行时,我会抛出一个异常:

System.DllNotFoundException

我是否必须在项目中添加CPP Dll的任何引用,或者除了上面的代码之外还要做其他事情


编辑:我正在尝试使用VS2015运行我的.exe,我在本地计算机上遇到此异常。此外,我在Project->References部分没有看到我的CPP Dll,我在那里看到了其他引用。

非托管Dll需要由托管进程定位。通常这意味着将DLL放置在与可执行文件相同的目录中。但是你给了我们一条绝对路径,我想你转录的是正确的

如果无法找到DLL的依赖项,也可能会遇到此错误。这似乎是可能的解释。加载DLL时很可能找不到MSVC运行时

使用绝对路径不是一个好主意。当你分发到另一台机器时,它会崩溃。仅使用DLL文件名,并将其放置在与可执行文件相同的目录中


你的DllImport属性似乎很挑剔。没有文本时指定字符集没有意义。我怀疑你的函数调用SetLastError。你真的需要精确的拼写吗

我将DllImport行更新为-[DllImport(“ctxmix.dll”,CallingConvention=CallingConvention.Cdecl)],并将cpp dll放置在与exe相同的位置。但我还是犯了同样的错误。我用VS2015运行这个。所以,我假设它应该包含所有与之相关的依赖项,对吗?另外,我在项目参考部分没有看到我的CPP Dll。我想知道这是否是个问题?不,你不需要DLL作为参考。无法找到DLL或其依赖项。谢谢@David。我使用了Dependency walker,发现它无法获得一些相关的依赖项。我将它们添加到C:\Windows\System32文件夹中,并将其添加到“Path”环境变量中。现在我可以克服这个错误了。非常感谢。这是错误的解决方案。不要修改系统文件夹。错误的解决方案。不要修改系统文件夹。安装MSVC运行时,或将依赖项放在可执行目录中。否,它不是重复项,因为它们可以在计算机上成功运行,但无法在其他Windows 2003计算机上加载。在我的例子中,当我使用VS2015运行计算机时,我在计算机中遇到此异常。我将使用
dumpbin/exports[此处的dll]
命令(包含在visual studio命令提示符中)查看导出的函数名的实际名称。可能的是,C++编译器是将新代码命名为其他代码,因此无法找到该函数。您可以通过将
ExactSpelling
更改为false来解决此问题。另外,我不认为CalpIn约定。Cdecl对C++ DLL是正确的,我认为你需要STDCALL。谢谢@ Cody。我使用了Dependency walker,发现它无法获得一些相关的依赖项。我将它们添加到C:\Windows\System32文件夹中,并将其添加到“Path”环境变量中。现在我可以克服这个错误了。非常感谢。