2010-04-08 12 views
1

J'ai créé une application dans C# vs2005 .net.Impossible de trouver un point d'entrée nommé 'interlockedexchange'

Tout fonctionne très bien quand je lance l'application dans la victoire 32 bits, mais lors de l'exécution de l'application dans la victoire 64, il se bloque tout en essayant d'appeler le PInvoke InterlockedExchange (qui se trouve dans la kernel32.dll) fonction.

C'est l'exception: incapable de trouver un point d'entrée nommé « InterlockedExchange »

Je ne ai pas trouvé la fonction InterlockedExchange dans le kernel32.dll sous le répertoire system32, mais il a été trouvé dans le répertoire syswow64 (dans le kernel32 .dll).

Je suppose que le runtime .net est configuré pour le répertoire system32 et non pour le syswow64. Comment est-il possible de changer cette configuration? Pouvez-vous penser à un autre problème qui pourrait causer cela? toute aide serait appréciée! merci,

Miki Amit

Répondre

0

Si vous utilisez Set InterlockedExchange et que vous souhaitez utiliser la version 32 bits, vous pouvez modifier les paramètres de votre projet pour l'obliger à s'exécuter en 32 bits. Accédez à l'onglet "Générer" dans les paramètres du projet et remplacez "Plate-forme cible" par x86. Il fonctionnera ensuite en 32 bits.

0

Cela ne répond pas directement à votre question, mais pourquoi ne pas appeler System.Threading.Interlocked.Exhange() plutôt que de recourir à P/Invoke?

+0

Merci pour votre réponse! Je dois définir une mémoire partagée Intptr (pointeur) et autant que je sache que l'Interlocked.Exhange ne peut changer que les variables .net –

+1

@Miki, ce n'est pas le cas, le .NET Interlocked.Exchange peut fonctionner sur n'importe quel emplacement de mémoire quel qu'il soit . Si c'est de la mémoire .NET, vous devez l'épingler en premier, bien sûr. Voir http://stackoverflow.com/questions/1116790/c-sharp-interlocked-exchange/5589515#5589515. –