Arun Kumar K S Ответов: 2

Вызов собственного кода C из Mono


Привет,

Я создал одно моно-приложение для вызова метода C из общей библиотеки в Linux. Мой код указан ниже

using System;
using System.Runtime.InteropServices;


namespace testConsole
{
    class MainClass
    {
        [DllImport("libTest.so",CharSet=CharSet.Auto,CallingConvention =CallingConvention.Cdecl, EntryPoint="testMethod",SetLastError=true ) ]
        public static extern void testMethod();

        public static void Main (string[] args)
        {
            Console.WriteLine ("Hello World!");
            testMethod();

            Console.WriteLine ("Hello World!");
        }
    }
}



и мой общий библиотечный код выглядит так

#ifndef SFLOW_H
#define SFLOW_H 1

#if defined(__cplusplus)
extern "C" {
#endif

void testMethod()
{

}

extern void testMethod1()
{
printf("This from C");
}

#if defined(__cplusplus)
}  /* extern "C" */
#endif

#endif /* SFLOW_H */



И я запускаю приложение, которое я могу загрузить в библиотеку C# с помощью DllImport. Но не в состоянии вызвать его метод.Как вызвать эту функцию testMethod () из моего моно-приложения ?

Пожалуйста, помогите мне...



Ошибка вроде этой

Привет, мир!

Необработанное Исключение: Система.EntryPointNotFoundException: testMethod
в (фантик удалось-к-родной) на testconsole.Основной класс:testMethod ()
в testConsole.Главный класс.основная система.String[] аргументы) [0x0000a] в /Home/Аруна/проекты/на testconsole/на testconsole Майне.СЅ:15
[Ошибка] фатальное необработанное исключение: система.EntryPointNotFoundException: testMethod
в (фантик удалось-к-родной) на testconsole.Основной класс:testMethod ()
в testConsole.Главный класс.основная система.String[] аргументы) [0x0000a] в /Home/Аруна/проекты/на testconsole/на testconsole Майне.СЅ:15

Нажмите любую клавишу, чтобы продолжить...

2 Ответов

Рейтинг:
1

sunilkumarsomani

По той же логике я могу это включить .таким образом, файл проекта c и может вызывать его функции с помощью c#. Но если я использую файл .so проекта c++ в c#, то он дает ошибку точки входа. пожалуйста, сообщите мне.


CHill60

Если у вас есть свой собственный вопрос, то используйте  задавать вопрос  ссылка. Не размещайте вопросы в качестве решений для старых сообщений. Вам нужно будет включить больше деталей, чем вы разместили здесь

Рейтинг:
0

krumia

Мне очень жаль, но я не заметил, что ваш вопрос был помечен Linux.

Это самое близкое, что я могу найти для вас: http://stackoverflow.com/questions/2345657/p-invoke-and-mono-entrypointnotfoundexception[^]

Попробовать это:

__declspec(dllexport) void testMethod()
{
 
}


См. (внимательно прочитайте) недавнюю статью: P / Invoke Tutorial: Основы (Часть 1)[^]

Прочтите это, чтобы понять __declspec(dllexport) смотрите этот разговор: http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/47808016-c624-4c99-8250-06a138b11c06[^]

Для получения дополнительной информации о __declspec(dllexport): http://msdn.microsoft.com/en-us/library/a90k134d(v=против 80). aspx[^]

Дополнительное Примечание: поскольку вы явно говорите о соглашении о вызовах в C# (CallingConvention =CallingConvention.Cdecl), лучше использовать тот же стиль и в C тоже. Так что это было бы лучше:

__declspec(dllexport) void __cdecl testMethod()
{
 
}


sunilkumarsomani

По той же логике я могу это включить .таким образом, файл проекта c и может вызывать его функции с помощью c#. Но если я использую файл .so проекта c++ в c#, то он дает ошибку точки входа. пожалуйста, сообщите мне.