Click here to Skip to main content
11,706,979 members (32,599 online)
Rate this: bad
good
Please Sign up or sign in to vote.
See more: Mono C++ C# Linux
Hello,

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

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

#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 17-Jun-12 21:03pm
Edited 17-Jun-12 21:12pm
v2

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

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:

__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:

__declspec(dllexport) void __cdecl testMethod()
{
 
}
  Permalink  
v2

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

  Print Answers RSS
0 Sergey Alexandrovich Kryukov 140
1 OriginalGriff 125
2 chainerlt 110
3 ppolymorphe 89
4 Mika Wendelius 70
0 OriginalGriff 9,178
1 Sergey Alexandrovich Kryukov 8,487
2 CPallini 5,189
3 Maciej Los 4,766
4 Mika Wendelius 3,696


Advertise | Privacy | Mobile
Web02 | 2.8.150819.1 | Last Updated 18 Jun 2012
Copyright © CodeProject, 1999-2015
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100