RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 773825
Accepted
Трипольский Пётр
Трипольский Пётр
Asked:2020-01-22 05:47:44 +0000 UTC2020-01-22 05:47:44 +0000 UTC 2020-01-22 05:47:44 +0000 UTC

使用 .Net Core 的本机代码

  • 772

Microsoft 有一篇文章专门介绍在各种平台上使用 .Net Core 中的本机代码。是的,他们举了一些例子,但他们没有谈论太多。比如这里调用WinAPI中的一个函数来在屏幕上显示一条消息, 在此处输入图像描述 但是如果dll是用32位编译器编译的,比如Windows上的标准Code::Blocks编译器用MinGW32,那么程序就可以运行了有一个BadImageFormatException 在此处输入图像描述异常。 我想在 Ubuntu 和 Windows 10 上访问弹出通知的示例中看到一个使用本机代码的 LIVE 示例

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Трипольский Пётр
    2020-01-22T05:47:44Z2020-01-22T05:47:44Z

    我在问题答案的最底部留下了下载整个示例的链接

    linux

    这里一切都很简单,在 64 位系统上,gcc 默认会编译 64 位二进制文​​件。因此,任务被简化为编写最简单的 C 函数,代码如下

    #include <stdio.h>
    #include <libnotify/notify.h>
    
    int notify(const char *title, const char *description,int timeout)
    {
      notify_init("dcnn");
      NotifyNotification* n = notify_notification_new (title, description, 0);
      notify_notification_set_timeout(n, timeout);
    
      if (!notify_notification_show(n, 0)) 
      {
        printf("Notification fallen");
        return -1;
      }
    
      printf("Notificated");
      //notify_uninit (void);
      return 1;
    }
    

    没什么复杂的。不要看内容,只是一个可以返回值的函数。顺便说一下,main() 是不需要的,因为我们将进一步将它移动到 .so,它不会自行运行。使用以下选项通过 gcc 编译:

    gcc -Wall -shared -o native.so -fPIC native.c `pkg-config --cflags --libs gtk+-2.0 libnotify` -lnotify
    

    使用一个命令进行编译很重要。是的,可以先获取 .o 对象模块,但是编译器肯定会忘记添加一些东西……我还建议您尝试从另一个 sish 程序动态导入库而不离开结帐,testing.cc文件位于其实现的 ubuntu 文件夹中的存储库中。但如果你能马上正确书写,那么你可以跳过

    组装后,我们得到文件native.so。您需要将其放入包含 .Net Core 程序集的文件夹中。默认情况下,我的程序集出现在目录中

    DotnetCoreNativeNotifications/bin/Debug/netcoreapp2.0/
    

    此外,这种情况被简单地称为。一切都与 MS 文档中的一样

    public class UbuntuNotify : AbstractNotify
    {
        public UbuntuNotify(){}
    
        [DllImport("native.so")]
        private static extern int notify([MarshalAs(UnmanagedType.LPStr)]string title,[MarshalAs(UnmanagedType.LPStr)]string description, int timeout);
    
        public override void Notify(string title, string desc, int timeout)
        {
            UbuntuNotify.notify(title,desc,timeout);
        }
    }
    

    在 Program.cs 我检查 if-th 平台,创建此类的实例并调用 Notify 方法

    在此处输入图像描述

    视窗

    首先,为应用程序编程选择合适的软件。我不建议尝试在 Visual Studio 中编写 dll。在我看来,它在 C# 下被锐化了,并且在其中编写动态链接库的过程会拖很长时间,因为愚蠢地没有收集 dll 的项目模板

    以 Code::Blocks,http://www.codeblocks.org/

    接下来,我们在上面放一个64 位编译器。这很重要,没有它,.Net Core 会认为 dll 无效

    一篇关于如何放在这里的文章,https://medium.com/@yzhong.cs/code-blocks-compile-64-bit-under-windows-with-mingw-w64-79101f5bbc02

    创建dll项目,C++语言 在此处输入图像描述

    记得选择正确的编译器 在此处输入图像描述

    此外,它将生成相当可读的代码。您可以在此处查看在 Windows 上显示通知的 dll 代码https://github.com/tripolskypetr/DotnetCoreNativeNotifications/blob/master/windows/native/main.cpp

    在我们写完dll之后,我们也把它和.Net Core程序集一起扔到了文件夹中,为了呼吁我实现了下面的类

    public class WindowsNotify : AbstractNotify
    {
        public WindowsNotify(){}
    
        [DllImport("native.dll", CallingConvention = CallingConvention.Cdecl)]
        private extern static void NotifyFunc([MarshalAs(UnmanagedType.LPStr)]string title, [MarshalAs(UnmanagedType.LPStr)]string desc);
    
        public override void Notify(string title, string desc, int timeout)
        {
            WindowsNotify.NotifyFunc(title,desc);
        }
    }
    

    结果,我们得到了一个 .Net Core 项目,它在 Ubuntu 和 Windows 10 上都给我们带来了通知。奇迹 在此处输入图像描述

    重要提示:数十种可能无法在不同版本上运行,因为使用了WinAPI并且它也发生了变化......我的电脑运行在1703版本上,它很旧。我建议尝试相同的示例,但是在 Windows 上的 dll 中,调用 MessageBoxA 函数,就像在 Code::Blocks 环境的 dll 模板中一样,我希望软的不会得到它。关于linux,我很冷静...

    void DLL_EXPORT SomeFunction(const LPCSTR sometext)
    {
        MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
    }
    

    您可以在此处查看此示例的完整代码,https://github.com/tripolskypetr/DotnetCoreNativeNotifications

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5