2017-09-19 3 views
0

Mon but est d'accéder à la fonction de fichier C# dll à partir de la bibliothèque ctypes de scripts python. Mon code C# est:Accès à la fonction de fichier C# dll à partir du code python

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using RGiesecke.DllExport; 
    using System.Runtime.InteropServices; 

    namespace ConsoleApp1 
    { 
     [ComVisible(true)] 
     public class Program 
     { 
    [DllExport("MyFunctionName", CallingConvention = CallingConvention.Cdecl)] 
    [return: MarshalAs(UnmanagedType.LPWStr)] 
    public static string MyFunctionName([MarshalAs(UnmanagedType.LPWStr)] string iString) 
    { 
     return "hello world i'm " + iString; 
    } 

    [DllExport("Add",CallingConvention = CallingConvention.Cdecl)] 
    public static int Add(int a, int b) 
    { 
     return a + b; 
    } 
    [DllExport(CallingConvention = CallingConvention.Cdecl)] 
    static public int Subtract(int a, int b) 
    { 
     return a - b; 
    } 
    [DllExport(CallingConvention = CallingConvention.Cdecl)] 
    static public int Multiply(int a, int b) 
    { 
     return a * b; 
    } 
    [DllExport(CallingConvention = CallingConvention.Cdecl)] 
    static public int Divide(int a, int b) 
    { 
     return a/b; 
    } 

    static void Main(string[] args) 
    { 
     //Console.Write(Add(2,3)); 
    } 
} 

}

et code python est:

import ctypes 
    a=ctypes.cdll.LoadLibrary('File Location') 
    a.MyFunctionName("a") 

mais je reçois une erreur AttributeError: la fonction 'MyFunctionName' not found

Comment je peux résoudre l'erreur que je ne peux pas accéder aux fonctions incluses dans le fichier dll?

Répondre

0

Peut-être que cela aide. De la documentation de RGiesecke.DllExport: - Vous devez définir votre cible de plate-forme sur x86, ia64 ou x64. Les assemblys AnyCPU ne peuvent pas exporter les fonctions. - Le nom d'exportation par défaut est le nom de la méthode et la convention d'appel à stdcall. Si c'est tout ce que vous voulez, vous pouvez simplement utiliser [DllExport] sans paramètres. - Vous ne pouvez pas placer vos exportations dans des types génériques ou exporter des méthodes génériques. (Le CLR ne connaîtrait pas les paramètres de type à utiliser)

+0

Bien que j'aie défini les plates-formes de solution sur x64 précédemment, j'obtiens toujours l'erreur. –