“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!

Ce n'est pas pour se plaindre d'une DLL manquante, il ne peut pas trouver le "test_dll_call" fonction dans la DLL. Très peu de moyens qui peuvent mal se passer, d'autres que d'avoir copié le mauvais DLL.
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