C# 如何调用C++;Xamarin表单项目中的库代码-DllNotFoundException

C# 如何调用C++;Xamarin表单项目中的库代码-DllNotFoundException,c#,c++,xamarin.forms,xamarin.android,C#,C++,Xamarin.forms,Xamarin.android,我有Xamarin表单跨平台项目-Android、iOS和UWP。我有一个C++ DLL项目,我从其中创建了一个DLL。我的意图是在XAMARIN FrAMS交叉点中集成/调用这些C++代码。我知道如何用C代码控制台应用程序调用C++,而不是代码> dLimPult汇编指令,但是在XAMARIN上,我得到 DLNONDUBFEXCEDUCTION< /COD> 那么,DLL文件必须复制或引用到哪里才能工作呢 我已经复制了调试文件夹中的.dll和其他文件(当前项目正试图在其中引用dll) 甚至尝

我有Xamarin表单跨平台项目-Android、iOS和UWP。我有一个C++ DLL项目,我从其中创建了一个DLL。我的意图是在XAMARIN FrAMS交叉点中集成/调用这些C++代码。我知道如何用C代码控制台应用程序调用C++,而不是代码> dLimPult汇编指令,但是在XAMARIN上,我得到<代码> DLNONDUBFEXCEDUCTION< /COD> 那么,DLL文件必须复制或引用到哪里才能工作呢

  • 我已经复制了调试文件夹中的
    .dll
    和其他文件(当前项目正试图在其中引用dll)
  • 甚至尝试添加对DLL文件的引用-出现错误无法添加文件
  • 将C++ DLL项目添加到相同的解决方案中,并引用它给出了<代码>系统。
  • 创建跨平台共享C++(我想这是NDK)库项目,但仍然得到相同的问题-<代码> DLNONDUBFUNDEXCEPUT> <代码> >
代码:
  • C++

    #include "stdafx.h"
    
    extern "C"{
    
        __declspec(dllexport) int add(int a, int b)
        {
            return a + b;
        }
        __declspec(dllexport) int subtract(int a, int b)
        {
            return a - b;
        }
    }
    
  • App.xaml.cs或任何其他.Net标准共享项目

    public partial class App : Application
    {
    [DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int subtract(int a, int b);
    
    
    [DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int add(int a, int b);
    
    [DllImport("XamCppDll.Shared.so")]
    public static extern int cpp_GetValue(int a, int b);
    
    public App()
    {
        InitializeComponent();
    
        int x = 100;
        int y = 15;
        int z = 0;
        int z1 = 0;
        try
        {
            cpp_GetValue(5, 6);//XamCppDll.Shared.so
            z = subtract(x, y);//Dll1.dll
            z1 = add(x, y);//Dll1.dll
        }
        catch (System.Exception ex1)
        {
            Debug.WriteLine(ex1.Message);
        }
    
        Debug.WriteLine(" {0} - {1} = {2}", x, y, z);
        Debug.WriteLine(" {0} + {1} = {2}", x, y, z1);
    
        MainPage = new MainPage();
    
    }
    
    }

  • 项目结构

    参考教程/代码


    在花了这么多时间和测试之后,我发现了这个问题

    在加载库中C++应该打包为<代码>,所以在Android中,(共享对象)扩展。 此文件必须打包并放置在android的

    .apk

    • 创建和编译XAMARIN C++跨平台共享库项目。
    • 编译特定于Android的链接项目以获得不同的架构 .so:x86、x64、ARM、ARM64-这些对应于不同的ABI 也是
    • 安卓ABI也是如此

    • 选项1:创建
      lib/abi\u name
      文件夹并将其设置为
      AnroidNativeLibrary
      ,其中
      abi\u name
      可以

      • 阿姆亚比
      • armeabi-v7a
      • arm64-v8a
      • x86
      • x86_64
        重要注意事项:为了。所以要复制到APK文件夹结构的文件应该与上面的完全相同。如果设备支持的体系结构是arm64-v8a,但只创建x86文件夹,那么APK中就不会有文件,我们仍然会得到DllNotFoundException

    • 选项2:如果有人想要工作代码,可以使用构建操作
      AndroidNativeLibrary
      将.so文件添加到android项目中。

      问题不在于xamcppdl.Shared.so,它不是xamcppdl.Shared.dll吗?根据教程,它应该是。所以我尝试了.dll和.so;它们都不起作用。Dll1.dll也不起作用也没有找到xamcppdl.Shared.so。它只是给出了带有HResult-hex地址的not found异常,没有提到这两种方法的.lib文件。DllNotFoundException不是更精确吗,没有找到哪个库?在我的内存中更精确…@NPE获得精确错误后,我更改了代码上的库名称,并尝试通过放置.so文件,但仍然是相同的错误。
      D/Mono(20164):DllImport尝试加载:“libxamcpdll.so”。W/Mono(20164):DllImport无法加载库“dlopen failed:library”/data/app/com.companyname.C_utest-1/lib/arm64/libxamcpdll.so“未找到”。
      是否确定所有项目都是用相同的目标体系结构(x86或x64)编译的避免任何CPU说谎。嗨,我正在考虑使用一个现有的C++库在iMaxIn表单项目中为iOS、Android和UWP头投影仪,我看到了你的帖子,谢谢分享。但是,我觉得你只是在为Android头项目提供解决方案,当你说“对于Android,我必须把DLL转换成这样”.iOS和UWP不也是这样吗?Thanks@pixel当你创建跨平台C++项目时,你将得到。一个你可以使用iOS和UWP的文件,你可以使用你现有的DLL。我还没有创建任何C++项目。我基本上试图在XAMARIN中重用一个旧的C++库。我理解的是你可以使用C。++UWP和WPF Xamarin中的lib(DLL?),android和iOS仍然需要它们的特定文件,这些文件可以嵌入到安装包中。有人知道在Xamarin.Forms UWP项目中使用C库吗?
      <ItemGroup>
      <AndroidNativeLibrary Include="path/to/libFile.so">
          <Abi>armeabi</Abi>
      </AndroidNativeLibrary>