.NET Standard和pInvoke,System.EntryPointNotFoundException无法找到入口点

时间:2018-12-13 10:30:02

标签: c# c++ .net-core pinvoke .net-standard

我认为已经针对较旧版本的Visual Studio提出了此问题,并且没有使用.NET Core 2.1或.NET Standard。

我目前正在Visual Studio 2017中处理.NET Core 2.1应用程序。在我的项目中,我需要使用C ++ / CLI项目中的现有DLL库(动态链接库)。之所以有点棘手,是因为.NET Core 2.1不支持现成的C ++ / CLI。

我的体系结构是:

  1. .NET Core项目 :,从我的.NET Standard获取业务逻辑 项目注入
  2. .NET标准项目:保存业务逻辑 并加载DLL。
  3. C ++ / CLI :动态链接库,提供了一些 其他业务逻辑,我无法更改为C#。

为了能够在我的C#编码中使用C ++ / CLI中的DLL,我使用 pInvoke 将功能加载到.NET Standard项目中。

我尝试测试:

 var test = MyLibHelper.AddNumbers(1, 2);

不幸的是,如果我没有将逻辑放入Hello World C ++ / CLI项目中,我总是会遇到以下错误:

System.EntryPointNotFoundException:'在DLL'MyLib.dll'中找不到名为'AddNumbers'的入口点。'

在我的.NET Standard(2)项目中,我有一个帮助器类来加载DLL方法:

internal static class MyLibHelper
{
    [DllImport("MyLib.dll", CallingConvention = CallingConvention.Cdecl)]
    internal static extern int AddNumbers(int n1, int n2);
}

在我的C ++ / CLI项目(3)中,我有一个源文件 MyLib.cpp ,其中公开了该功能:

extern "C" __declspec(dllexport) int AddNumbers(int n1, int n2)
{
    return n1 + n2;
}

实际上,如果我创建一个没有头文件的Hello World C ++ / CLI项目并使用__declspec(dllexport)和extern“ C”,则此编码可以正常工作。

我的问题是:

我需要使用现有项目,而不是Hello World C ++ / CLI应用程序

  • 在头文件和源文件中都应在哪里将这个extern“ C”放在哪里?
  • 我需要使用头文件,因此有必要放置extern “ C”和__declspec(dllexport)以及它是否也进入头文件?
  • 我不断收到错误消息“无法找到名为...的入口点”, 在哪里可以找到我的C ++方法的入口点?
  • 关于入口点,我读到了有关“名称混杂”的信息-您知道在哪里/如何/在哪个文件中可以找到C ++方法的错误名称?

非常感谢您!

0 个答案:

没有答案