- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在过去的几天里,我一直在尝试与 Linux 上的 dotnet core 中的 C 库(为 ARM 平台构建)进行交互。我想做的就是调用一个简单的函数,它(本质上)返回一个字符串。
但是,我没有在 C# 中使用 DLLImport
或互操作的经验,而且我很挣扎。
C 代码看起来像(当我使用工作平台时使用替换名称):
int version(int argc, char *argv[])
{
return READ_DATA(0,
version, //callbackfunction
"version: 0x%04x\n"); //formatting string
}
public class Board
{
private Interop_Commands _commands = new Interop_Commands();
public string GetVersion()
{
return _commands.GetVersion();
}
}
internal class Interop_Commands
{
public const string LIBRARYPATH = "libname";
[DllImport(LIBRARYPATH,CharSet=CharSet.Unicode, CallingConvention =CallingConvention.Cdecl)]
public static extern int version(int argc, StringBuilder argv);
public string GetVersion()
{
var sb = new StringBuilder();
Console.WriteLine($"Calling {nameof(version)}");
version(0, sb);
Console.WriteLine($"Called {nameof(version)}, got: {sb.ToString()}");
return sb.ToString();
}
}
与调用类(主要用于这个非常简单的概念验证/试用代码):
static void Main(string[] args)
{
Console.WriteLine("Getting Version from board..");
var board = new Board();
Console.WriteLine(board.GetVersion());
Console.WriteLine("done");
Console.ReadLine();
}
文件夹结构为(简化):
folder
|--> Dll/runtime
|--> libname (note no .so here, just libname)
任何帮助将不胜感激,我正在寻找有限的 C 导入/使用示例,并且还找到了如何在 dotnet core 中使用自定义库的有限示例。
编辑 1:
在@Sohaib Jundi的帮助下,我添加了extern
,因此签名现在是:(它不会使用extern“C”进行编译)
extern int version(int argc, char *argv[])
我不确定下一步要尝试什么。
但是 dotnet core 不会使用 x86 并将目标运行时设置为 linux-arm
进行发布,只会引发未知异常,日志文件也没有太大帮助。如果我将编译后的库与之前的代码(AnyCPU
+ linux-arm
)一起使用,那么仍然会抛出DllNotFoundException
* 编辑 2:*
事实证明,我使用的原始无扩展文件似乎是引用静态库的可执行文件(最终编译为可执行文件)。重建我已经设法将静态库分开,但仍然得到相同的DllNotFoundException
。有谁知道 dotnet core 上 DllImport
的搜索过程是什么?
互操作/导入代码现在如下所示:
[DllImport("libname",
CallingConvention =CallingConvention.Cdecl,
EntryPoint= "version")]
public static extern int version(ref uint val);
静态库代码如下所示:
extern int version(uint32_t *);
最佳答案
经过一番尝试后,我设法找到了一个可以工作的示例。
请按照下列步骤操作:
1. 从 dll 中导出函数,即:将 extern "C"__declspec(dllexport)
添加到函数签名
2. 确保 dll 和您的 dotnet core 应用程序具有相同的体系结构。不要将 dotnet 核心保留为“任何 CPU”,强制其与 dll 具有相同的架构。 (项目属性 -> 构建 -> 平台目标 = x86 或 x64)
关于c# - Dotnet 核心的 DllImport 返回当前 DLL 的 DLLNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56957459/
我有一个类,里面有一些静态成员函数。假设类 B,这个类有一个基类,它来自第三方库,比如 A。现在类 A 已经用 dllimport 和用mingw 我可以毫不费力地构建 sharedlibs 或那个类
在 C# 中,我有这个: [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] public static extern Int
我正在尝试编写一个使用 C++ 中定义的函数的 WPF 应用程序。 C++ 应用程序被编译为 DLL。 我正在做的是使用 DllImport 属性导入函数并使用它。这在我的机器上运行良好,但是当我尝试
有没有办法为一组外部函数指定相同的 DllImport 属性,类似于 extern "C"{ … } ?我不想为每个函数声明重复它:-) 最佳答案 没有。避免它的唯一方法是在 C++/CLI 中编写一
我正在尝试将短类型的参数传递给从 DLL 导入的 C++ 非托管函数。在我的 C++ DLL 代码中,我有以下函数: __declspec(dllexport)void ChangeIcon(char
我有一个第三方 c dll,我想在我的 c# 项目中使用它。我设法导入了一种读取文件头的方法。现在我想访问读取数据的方法。我认为问题在于包含字符串数组的结构,因此我尝试了各种方法,例如 StringB
如何使用反射枚举程序集中的所有 DLLImports? 最佳答案 遍历每个类中的每个方法,并检查 GetCustomAttributes(typeof(DllImportAttribute)) 是否返
在 asp.net 中,如果我使用 DLLImport 调用一个 dll,有人知道该实例的范围吗?它是在应用程序级别,所以任何后续调用都会转到 dll 的同一实例,直到应用程序结束? 我有一个 dll
我想了解 DllImport 的真正工作原理。我需要一个通俗易懂的英语解释——意思是简单的解释。 它是否与 DLL 中导出的方法静态链接,如“包含文件”指令/静态库? 还是在C#程序中到达执行点时动态
我正在尝试编写一个 C# 托管类来包装 SHGetKnownFolderPath,到目前为止它可以在 Vista 上运行,但由于在 shell32.dll 中找不到正确的函数而在 XP 上崩溃,正如预
我有一个带有 C++ 组件的 C# 应用程序。我在模块之间使用 DllImport 进行通信。该应用程序可以正常工作很多天,有时会意外崩溃。 [DllImport("recorder", Callin
这个问题在这里已经有了答案: Loading a 32-bit dll in a 64-bit process [duplicate] (1 个回答) 关闭 8 年前。 我希望我的 C# 应用程序有
我正在通过 C# 与 native 第 3 方 C++ DLL 进行交互,所提供的互操作层如下所示: C#: [DllImport("csvcomm.dll")] public static exte
我正在使用 [DLLImport] 属性访问我的 .NET 代码中的一堆 C++ 函数。现在,我通过以下方式拥有所有功能: const string DLL_Path = "path\\to\\my\
假设在 Native.dll 中有一个 c++ 方法 int NativeMethod(double, double *)。我第一次尝试从托管代码调用此方法(假设我不需要指定入口点) [DllImpo
我正在做一个P/Invoke,我正在使用下面的方法 [DllImport("Authz.dll", SetLastError = true)] public static extern BOO
static class Class { public static void methodRequiringStuffFromKernel32() { // c
我正在使用 [DllImport]属性将 native DLL 导入我的应用程序,但它加载的 DLL 不在本地 bin 文件夹中。它是从系统的其他地方加载的,但我不知道在哪里。 它适用于我的开发机器,
我刚刚在 C# 中遇到了 DllImport 的奇怪行为,我无法解释。我想知道它是如何可能的,以及我可以在哪里阅读它。案例是通过 DllImport 可以调用不真正导出表单 dll 的函数。就我而言,
我尝试使用 P/Invoke 将示例 .net 应用程序转换为 javascript JSIL . C# 代码: [DllImport("JSTestLib", EntryPoint = "Get42
我是一名优秀的程序员,十分优秀!