2012-05-08 2 views
2

Je travaille sur un site Web ASP.NET, en développement dans Visual Studio 2010. La plupart du site est écrit en code managé (F # et C#), mais il utilise une DLL non gérée (QuickPDF) pour certaines de ses fonctionnalités. Le site fonctionne correctement en local, mais lorsqu'il est déployé sur un fournisseur d'hébergement (aspnethosting.co.uk), l'appel de LoadLibrary échoue, renvoyant un descripteur de IntPtr.Zero. Selon la console du fournisseur d'hébergement, le site fonctionne à un niveau de confiance de Full (interne). La DLL se trouve dans le répertoire bin du site Web et le fournisseur d'hébergement me dit qu'il dispose des autorisations appropriées.Chargement d'une DLL non gérée à l'aide de LoadLibrary dans un site Web ASP.NET

J'ai essayé d'utiliser aucun chemin spécifique à la DLL, en utilisant. \, Et aussi de travailler sur ce que le chemin d'assemblage actuel utilise Assembly.GetExecutingAssembly(). CodeBase (voir code F # ci-dessous) - qui fonctionne bien lors de l'exécution locale.

Tout ce que je peux faire d'autre pour aider à l'épingler?

est ici le code F # qui fonctionne sur le chemin de la DLL:

let assemblyDirectory = 
    let codeBase = Assembly.GetExecutingAssembly().CodeBase; 
    let uri = new UriBuilder(codeBase) 
    let path = Uri.UnescapeDataString(uri.Path) 
    Path.GetDirectoryName(path) 

est ici où le code F # utilise ce chemin (après avoir vérifié qu'elle pointe vers la DLL)

let dllPath = Path.Combine(assemblyDirectory, "QuickPDFDLL0814.dll") 
if not (File.Exists(dllPath)) then 
    failwith ("Could not find QuickPDF DLL at: " + dllPath) 
let lib = QuickPDFDLL0814.PDFLibrary(dllPath) 

Voici la Code C# où une tentative est faite pour charger la DLL QuickPDF - c'est où il échoue - ie. dllHandle IS est égal à IntPtr.Zero.

public PDFLibrary(string dllFileName) 
    { 
     dll = new DLL(dllFileName); 
     if (dll.dllHandle != IntPtr.Zero) 
     { 
      instanceID = dll.QuickPDFCreateLibrary(); 
      dll.RegisterForShutdown(instanceID); 
     } 
     else 
     { 
      dll = null; 
     } 
    } 
... 
    public DLL(string dllFileName) 
    { 
     dllHandle = LoadLibrary(dllFileName); 
     if (dllHandle == IntPtr.Zero) 
      throw new InvalidOperationException("Could not load library " + dllFileName); 
     else 
     { 
+0

voir ce que Marshal.GetLastWin32Error retourne après l'appel LoadLibrary –

+0

Antonio - Merci pour l'indice. Il renvoie 0. Je ne suis pas sûr de ce que cela me dit malheureusement. – Kit

Répondre

1

LoadLibrary échoue lorsque dll peut être chargé.

Cela peut se produire lorsque la DLL n'existe pas (introuvable) OU que la DLL existe (et a été trouvée) mais que certaines dépendances de cette DLL n'ont pas pu être chargées. Je vous suggère: 1. comparez la variable d'environnement PATH dans les deux cas. Essayez la fonction GetEnvironmentVariable. 2. Découvrez quels composants sont utilisés par QuickPDF.dll et vérifiez s'ils sont présentés à aspnethosting.co.uk

2

Je l'ai craqué. QuickPDF fournit une version 32 bits et 64 bits de la DLL. Je devais utiliser la version 64 bits. [Visage rouge.] Merci à ceux qui ont fourni des réponses.

Questions connexes