2009-04-05 26 views
5

Abbiamo una particolare macchina Vista x64 che, durante l'esecuzione del nostro C# WinForms app, viene visualizzato il seguente errore:Impossibile trovare un punto di ingresso denominato 'TaskDialogIndirect' nella DLL 'ComCtl32'

System.EntryPointNotFoundException: Unable to find an entry point named 'TaskDialogIndirect' in DLL 'ComCtl32'.

Questo stesse opere di codice bene su altre macchine Vista. Per qualche ragione, questa particolare macchina Vista genera sempre questa eccezione.

Come possiamo risolvere questo problema?

risposta

7

Ho avuto problemi con questo e il gratuito XTaskDialog API di Naughter, per ottenere un meccanismo di fallback su macchine Windows XP tramite emulazione, rendendo questa implementazione di finestra di dialogo molto più utile. :)

Nel mio caso si trattava di un problema di contesto di attivazione, come menzionato in questo blog entry.

Oppure, citato qui, nel caso in cui il post sul blog è perso nel cyberspazio un giorno (si applica a Visual Studio):

  1. Apri le proprietà del progetto in Esplora soluzioni,
  2. Nella scheda Protezione, controllo Attiva Impostazioni di sicurezza ClickOnce,
  3. Ora è possibile vedere apparire il file app.manifest nella cartella delle proprietà della soluzione, aprirlo,
  4. sotto il tag </trustInfo >, inserire il codice qui sotto.
  5. Se si tenta di creare, potrebbe essersi verificato un errore. Per risolvere il problema, deselezionare Abilita impostazioni di sicurezza ClickOnce.

Il codice da inserire al punto 4:

<dependency> 
    <dependentAssembly> 
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" 
     version="6.0.0.0" processorArchitecture="*" 
     publicKeyToken="6595b64144ccf1df" language="*" /> 
    </dependentAssembly> 
</dependency> 
+0

Grazie, proveremo. –

+0

Sto riscontrando lo stesso problema in un progetto di libreria DLL (plugin Excel). Non esiste una scheda di sicurezza in VS Studio per i progetti di libreria? –

+1

Attualmente (VS 2012/2013) questa soluzione non funziona :(Funziona comunque come un fascino: http://support.microsoft.com/kb/830033 –

1

Suggerirei di confrontare la versione di comctl32.dll sulle macchine Vista funzionanti e non funzionanti e confrontando i relativi checksum anche se riportano la stessa versione.

Altre cose da controllare:

  • E 'possibile che la macchina non funzionante ha una versione pre-release di Vista?
  • È possibile che una versione non Vista di comctl32.dll sia stata copiata sulla macchina e venga prelevata dall'applicazione? (L'utilità Depends fornita con Visual Studio può essere d'aiuto.)
  • È possibile che un virus o worm (o cosa no) abbia sostituito comctl32.dll?

Potrebbe anche valere la pena leggere questo article in contesti di attivazione.

+0

Grazie, avremo uno sguardo a questo. Se ci conduce alla risposta, accetterò la tua risposta come corretta. –

1

Se le altre macchine utilizzate per eseguire il programma utilizzavano Vista x86, è probabile che nel codice vi sia un PInvoke che causa il problema. Si consiglia di provare a impostare l'architettura di destinazione del compilatore su x86 per forzare l'esecuzione del programma in WoW64 su x64 Vista. Per impostazione predefinita, Visual Studio utilizza le impostazioni per creare assiemi in modo indipendente dall'architettura. Ciò significa che quando si tenta di eseguire un programma .NET su un sistema a 64 bit, dovrebbe essere eseguito ospitato da una versione x64 nativa del CLR. Attemptiong per caricare una DLL a 32 bit in quel contesto avrà esito negativo. Forzare l'esecuzione dell'app in modalità x86 emulata, invece, dovrebbe fare il trucco.

+0

Grazie, ma abbiamo già impostato l'app per compilare come x86, poiché utilizziamo alcuni componenti che non sono pronti per x64. –

Problemi correlati