2012-01-23 3 views
13

J'ai un projet C# qui contient une référence à ScintillaNET. Malheureusement, ScintillaNET aime détecter l'architecture de la machine et charger la DLL native en fonction de l'architecture en cours d'exécution. Cela signifie que mon projet doit être pré-compilé en versions x86 et x64 (je ne peux utiliser aucun CPU en raison de la détection ci-dessus).Compilation d'un binaire C# .NET x64 sur un système x86

Le problème est que mon serveur de génération est uniquement x86. Existe-t-il un moyen de compiler un assembly .NET en mode x64 sur une machine x86? Autant que je sache, la bascule oblige simplement l'ordinateur à charger l'assemblage pour l'architecture requise et ne génère pas de code dépendant de l'architecture lors de la compilation, cependant, lors de la compilation sous Mono 2.10.6 sur le serveur de build I obtenez des erreurs telles que:

« CS0016 d'erreur: Impossible d'écrire dans le fichier` ScintillaNet », la cause: AMD64"

Je ne peux pas utiliser CorFlags.exe pour modifier les en-têtes PE car cela est basé sur Linux construire le serveur. Est-ce qu'il y a un moyen de faire ça?

+5

Cela n'a aucun sens, le bitness est déterminé par l'ensemble de démarrage principal (EXE), pas par une bibliothèque comme ScintillaNET. Utilisez AnyCPU. –

+4

On dirait que son projet est le principal assemblage de démarrage. S'il commence comme x86 sur une machine x64, Scintilla fera sa propre détection, trouvera x64, essaiera de charger des dll x64 natives dans l'application x86 et échouera. Vraiment, c'est un bug dans Scintilla qui ne détecte pas l'architecture du processus en cours, au lieu de la machine. – antiduh

+0

Selon la documentation mono, l'option '--aot' ne prend pas la plate-forme comme paramètre. Cela ne semble pas possible pour le moment. –

Répondre

2

J'ai fini par résoudre ce problème en retournant le projet à Any CPU. Comme Scintilla fonctionne uniquement dans l'architecture native indépendamment des paramètres .NET, j'ai dû l'exécuter en 64 bits sur ma machine. À l'origine, j'avais l'intention de forcer l'architecture à 32 bits pour obtenir Edit and Continue, ce qui conduisait à la confusion sur la façon dont Scintilla détectait les architectures.

En réalité, Scintilla va se forcer à l'architecture native, mais si vous construisez et exécutez sous Any CPU, l'application .NET fonctionnera très bien. De plus, comme je ne peux pas exécuter une application .NET avec Scintilla en mode 32 bits (pour Edit et Continue to work), je n'ai aucun avantage à forcer le mode 64 bits sur ma machine non plus.

Questions connexes