Microsoft 有一篇文章专门介绍在各种平台上使用 .Net Core 中的本机代码。是的,他们举了一些例子,但他们没有谈论太多。比如这里调用WinAPI中的一个函数来在屏幕上显示一条消息,
但是如果dll是用32位编译器编译的,比如Windows上的标准Code::Blocks编译器用MinGW32,那么程序就可以运行了有一个BadImageFormatException异常。
我想在 Ubuntu 和 Windows 10 上访问弹出通知的示例中看到一个使用本机代码的 LIVE 示例
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 的项目模板
我在问题答案的最底部留下了下载整个示例的链接
linux
这里一切都很简单,在 64 位系统上,gcc 默认会编译 64 位二进制文件。因此,任务被简化为编写最简单的 C 函数,代码如下
没什么复杂的。不要看内容,只是一个可以返回值的函数。顺便说一下,main() 是不需要的,因为我们将进一步将它移动到 .so,它不会自行运行。使用以下选项通过 gcc 编译:
使用一个命令进行编译很重要。是的,可以先获取 .o 对象模块,但是编译器肯定会忘记添加一些东西……我还建议您尝试从另一个 sish 程序动态导入库而不离开结帐,testing.cc文件位于其实现的 ubuntu 文件夹中的存储库中。但如果你能马上正确书写,那么你可以跳过
组装后,我们得到文件native.so。您需要将其放入包含 .Net Core 程序集的文件夹中。默认情况下,我的程序集出现在目录中
此外,这种情况被简单地称为。一切都与 MS 文档中的一样
在 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程序集一起扔到了文件夹中,为了呼吁我实现了下面的类
结果,我们得到了一个 .Net Core 项目,它在 Ubuntu 和 Windows 10 上都给我们带来了通知。奇迹
重要提示:数十种可能无法在不同版本上运行,因为使用了WinAPI并且它也发生了变化......我的电脑运行在1703版本上,它很旧。我建议尝试相同的示例,但是在 Windows 上的 dll 中,调用 MessageBoxA 函数,就像在 Code::Blocks 环境的 dll 模板中一样,我希望软的不会得到它。关于linux,我很冷静...
您可以在此处查看此示例的完整代码,https://github.com/tripolskypetr/DotnetCoreNativeNotifications