В последние несколько дней я пытался взаимодействовать с библиотекой C (созданной для платформы ARM) в Linux, в ядре dotnet.Все, что я пытаюсь сделать, это вызвать простую функцию, которая (по существу) возвращает строку.
Однако у меня нет опыта использования DLLImport
или взаимодействия в целом в C #, и я борюсь.
Код на 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();
}
Структура папок (упрощенная):
папка
| -> Dll / runtime
| -> libname (примечание №. Так вот, просто имя_библиотеки)
Любая помощь будет принята, я нахожу ограниченные примеры импорта / использования C, а также ограниченные примеры использования пользовательских библиотек в ядре dotnet.
РЕДАКТИРОВАТЬ 1:
Следуя справке @Sohaib Jundi, я добавил extern
, так что подпись теперь: (она не компилируется сextern "C")
extern int version(int argc, char *argv[])
Я не уверен, что делать дальше.
но ядро dotnet не будет публиковать wix86 и целевая среда выполнения, установленная на linux-arm
, просто выдают неизвестное исключение, при этом файл журнала не очень полезен. Если я использую скомпилированную библиотеку с предыдущим кодом (AnyCPU
+ linux-arm
), то DllNotFoundException
все еще выбрасывается
* РЕДАКТИРОВАТЬ 2: *
Оказывается, исходный файл без расширений, который я использовал, выглядит как исполняемый файл, ссылающийся на статическую библиотеку.(который в конечном итоге компилируется в исполняемый файл).Перестройка Мне удалось отделить статическую библиотеку, но все равно получить тот же DllNotFoundException
.Кто-нибудь знает, какова процедура поиска для DllImport
в ядре dotnet?
Код взаимодействия / импорта теперь выглядит следующим образом:
[DllImport("libname",
CallingConvention =CallingConvention.Cdecl,
EntryPoint= "version")]
public static extern int version(ref uint val);
, где статический код lib выглядит следующим образом:
extern int version(uint32_t *);