2009-06-02 8 views
0

Le code entier de la DLL a été écrit en utilisant C natif et une fonction est ci-dessous pour votre référence.Code C natif non géré vers .NET compatible

int32 dllimport swe_calc FAR PASCAL ( double TJD, int ipl, int32 iflag, double * xx, char * SERR);

La plupart des fonctions sont écrites en utilisant FAR PASCAL et lorsque j'ai essayé de convertir cette DLL en compatible avec .net, j'étais en panne d'erreurs.

J'ai essayé en changeant la propriété Comman Runtime Support de "No Common Runtime Support" en Common Runtime Support (ie \ clr). et changé le \ MD aussi. Lorsque j'ai essayé d'enregistrer la DLL en utilisant Regsvr32 à partir de l'invite de commande, j'ai eu l'erreur indiquant que "Le module" mydll.dll "a été chargé par le point d'entrée DllRegisterServer n'a pas été trouvé".

J'aime utiliser cette DLL de mon application C#, ce sera vraiment génial si quelqu'un m'aide avec ça.

Merci à l'avance.

Gan

Répondre

1

Vous n'avez pas besoin de modifier les paramètres de compilation pour la dll (support d'exécution commun) - ceci est valable pour les assemblages en mode mixte écrits en C++/cli. Vous pouvez l'utiliser, mais il est possible d'utiliser la DLL sans y apporter de modifications et c'est le scénario courant. De grandes parties du framework .NET font exactement cela - en utilisant des DLL natives win32.

Vous n'avez pas non plus besoin de regsvr32 et n'avez pas besoin de rendre la DLL "compatible" avec .NET, c'est déjà le cas. L'appel de fonctions natives à partir de .NET est pris en charge hors de la boîte et est très commun. Assurez-vous simplement que le fichier dll peut être trouvé à partir de l'application .net - placez-le dans le même répertoire ou dans le chemin.

Déclarez les fonctions dans C# avec DllImport en utilisant le nom .dll et utilisez-les. Envisager des problèmes de x64 si vous devez le prendre en charge - vous aurez peut-être besoin de la version x64 de la DLL. Assurez-vous que le code .NET charge la DLL correcte en fonction de l'architecture.

L'autre direction "appelant le code .NET à partir du C .dll" peut être plus compliquée, mais elle est également supportée.

+0

Merci pour votre réponse. J'ai essayé comme vous l'avez suggéré ci-dessous, [DllImport ("swedll32.dll")] public static extern double swe_set_lapse_rate (double lapse_rate); private void button1_Click (expéditeur d'objet, EventArgs e) { double t = swe_set_lapse_rate (200) ;; } J'ai déclaré et appelé cette fonction dans le clic sur le bouton et obtenu l'exception "system.dllnotfoundexception". Des informations supplémentaires comme "uanble to load dll". Faites-moi savoir si je me trompe quelque part. Merci –

+1

Cela vous dit qu'il ne peut pas trouver la DLL. Essayez de le mettre là où il peut être trouvé. Si vous ouvrez une invite de commande et tapez "Path", vous obtiendrez une liste d'endroits où vous pouvez le déposer et Windows sera en mesure de le trouver. –

0

Il a fallu environ 30 secondes pour trouver la source et la documentation pour cela en insérant la signature de la fonction dans Google Code Search. Vous devriez être capable d'utiliser Interop pour travailler avec.

Il semble y avoir une solution VB.Net incluse dans sweph.zip - cela peut aider.

0

Merci à tous,

J'ai finalement résolu le problème avec votre aide, j'utilisais Vista 64 bits, alors je suis l'erreur comme System.DllNotFoundException.

Lorsque j'ai changé la plate-forme de «Any CPU» à «X86» et compilé l'application cela a fonctionné et j'ai placé la DLL dans le "C: \ Windows \ SysWOW64 \".J'ai utilisé la fonction DllImport, cela a fonctionné.

Merci vous les gars pour votre aide, genre

Gan

Questions connexes