Click here to Skip to main content
15,868,016 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello,

I created one Mono application to call C method from a shared library in Linux. My code is listed below

C#
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!");
        }
    }
}



and my shared library code like this

C#
#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 */



And I run the application I can load the library to C# using DllImport. But unable to call its method.How to call that testMethod() function from my mono application ?

Please help me...



The error like this

Hello World!

Unhandled Exception: System.EntryPointNotFoundException: testMethod
at (wrapper managed-to-native) testConsole.MainClass:testMethod ()
at testConsole.MainClass.Main (System.String[] args) [0x0000a] in /home/arun/Projects/testConsole/testConsole/Main.cs:15
[ERROR] FATAL UNHANDLED EXCEPTION: System.EntryPointNotFoundException: testMethod
at (wrapper managed-to-native) testConsole.MainClass:testMethod ()
at testConsole.MainClass.Main (System.String[] args) [0x0000a] in /home/arun/Projects/testConsole/testConsole/Main.cs:15

Press any key to continue...
Posted
Updated 14-Mar-17 23:12pm
v2

I'm so sorry, I did not notice that your question was tagged with Linux.

This is the closest thing I can find for you: http://stackoverflow.com/questions/2345657/p-invoke-and-mono-entrypointnotfoundexception[^]

Try this:

C++
__declspec(dllexport) void testMethod()
{
 
}


See (read carefully) the recent article: P/Invoke Tutorial: Basics (Part 1)[^]

Read this to understand __declspec(dllexport) see this conversation: http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/47808016-c624-4c99-8250-06a138b11c06[^]

For additional info on __declspec(dllexport): http://msdn.microsoft.com/en-us/library/a90k134d(v=vs.80).aspx[^]

Additional note: Since you are explicit about the calling convention in C# (CallingConvention =CallingConvention.Cdecl), its better to use the same style in C too. So this would be better:

C++
__declspec(dllexport) void __cdecl testMethod()
{
 
}
 
Share this answer
 
v2
Comments
sunilkumarsomani 15-Mar-17 5:12am    
For same logic i am able to include .so file of c project and can call its functions by c#. But if i use .so file of c++ project into c# then its giving entry point error. please update me.
For same logic i am able to include .so file of c project and can call its functions by c#. But if i use .so file of c++ project into c# then its giving entry point error. please update me.
 
Share this answer
 
Comments
CHill60 15-Mar-17 6:05am    
If you have a question of your own then use the  Ask a Question  link. Do not post questions as solutions to old posts. You will need to include more detail than you have posted here

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900