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
{
voir ce que Marshal.GetLastWin32Error retourne après l'appel LoadLibrary –
Antonio - Merci pour l'indice. Il renvoie 0. Je ne suis pas sûr de ce que cela me dit malheureusement. – Kit