“La procédure spécifiée est introuvable” erreur avec .NET 4
Je suis en train d'élaborer sur une version 64 bits de Windows 7 boîte avec Visual Studio 2012 (11.0.51106.01 mise à Jour 1).
J'ai un projet d'Appui qui permet de compiler du code C dans un (32 bits) DLL. Dans ma tête j'ai:
#define RET_TYPE(type) _declspec(dllexport) type __stdcall
RET_TYPE(int) test_dll_call(int invar);
Dans mon fichier C j'ai:
RET_TYPE(int) test_dll_call(int invar)
{
int retVal = 4 * invar;
return retVal;
}
J'ai aussi une (32 bits) WPF C# de l'application de chargement de la DLL à l'intérieur d'une classe comme suit:
[DllImport("MyDll.dll", CharSet = CharSet.Ansi, BestFitMapping = true, ThrowOnUnmappableChar = true)]
public static extern int test_dll_call(int invar);
C'est enveloppée comme suit:
public void Wrap_TestDllCall()
{
try
{
int outTest = 0;
int invar = 3;
outTest = test_dll_call(invar);
}
catch (Exception ex)
{
dllError = ex.ToString();
}
}
Lorsque je l'exécute dans le débogueur sur mon développement de la zone, cela fonctionne bien. Si je copie tous les fichiers dans un dossier distinct et exécuter à partir de là, il fonctionne très bien.
Si je copie tous les dossiers vers un autre ordinateur exécutant Windows XP 32 bits SP3 j'obtiens l'erreur suivante:
System.DllNotFoundException: Unable to load DLL 'MyDll.dll': The specified procedure could not be found. (Exception from HRESULT: 0x8007007F)
at MyNamespace.MyClass.test_dll_call(Int32 invar)
at MyNamespace.MyClass.Wrap_TestDllCall()
J'ai utilisé dependency walker sur mes deux compilé en exe et la dll; le seul manquant dll il trouvé wer.dll
et ieshims.dll
, qui d'après mes recherches ne sont pas nécessaires sur XP.
J'ai installé le VS2012 C++ Redistribuable, et .NET 4, et la .NET mise à jour 4.0.3. Toujours pas de chance.
Modifier Comme Hans points, ce apparaît être que l'application ne parvient pas à trouver la procédure dans la DLL; j'ai aussi essayé:
[DllImport("MyDll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int test_dll_call(int invar);
et
__declspec(dllexport) int __cdecl test_dll_call(int invar);
Qui fonctionne aussi très bien sur ma boîte de dev, mais donne le même message d'erreur sur l'WinXP boîte.
Aider!
Ok, donc ce que sont ces autres façons de faire? Il fonctionne sur ma boîte de dev, mais pas sur mon WinXP test de l'ordinateur portable.
OriginalL'auteur Lone Shepherd | 2013-02-15
Vous devez vous connecter pour publier un commentaire.
Le problème est résolu. Des choses à noter que je suis passé par les étapes de dépannage, pour ceux qui trébuchent sur ce sujet dans le futur.
X
-- ou plutôt, il peut dire qu'il ne peut pas trouver de fonctionY
, à partir d'une autre dll, qui est appelé parX
.Dans mon test ci-dessus en exemple, le problème était que j'était en train de rassembler une version de Débogage.
Cependant, dans ma fonction, que le changement n'a pas résolu le problème. Il s'avère qu'il me manquait certaines Dll qui dependency walker n'a pas l'attraper.
OriginalL'auteur Lone Shepherd