Question:Comment utiliser les DLL natives dans ASP.NET?
J'utilise System.Data.OracleClient.
System.Data.OracleClient requiert OracleInstantClient, qui sont des DLL natives. Donc, pour utiliser System.Data.OracleClient, j'ai besoin de la DLL native installée, ou dans un dossier de la variable d'environnement path.
Maintenant, le problème de base est, je n'ai pas les droits d'administrateur (entreprise portable - bêtise corporative - ne va pas changer) ...
Donc je ne peux rien installer, ni copier quoi que ce soit dans un dossier dans PATH , je ne peux pas non plus ajouter un dossier à la variable d'environnement path, je ne peux pas redémarrer/administrer IIS ou tout autre service ...
Comme test, je viens de copier oci.dll et oraociei11.dll dans le même dossier comme le WinForms .exe.
Cela a bien fonctionné. J'ai pu accéder à la base de données Oracle (SELECT * FROM COUNTRIES) sans problèmes.
Mais maintenant, j'ai besoin d'effectuer la même requête dans une solution ASP.NET. Le problème est que les fichiers ASP.NET dll sont copiés dans un dossier temporaire lors de leur exécution.
Maintenant, pour obtenir les dll à la poubelle webapp non le moins,
dans Global.asax dans
public class MvcApplication : System.Web.HttpApplication
Je réenregistrés Init avec ceci:
public override void Init()
{
int iBitNess = IntPtr.Size;
//System.Windows.Forms.MessageBox.Show(iBitNess.ToString());
// iBitNess = 4, so 32 bit dll's are right
string strTargetDirectory = System.Reflection.Assembly.GetExecutingAssembly().Location;
strTargetDirectory = typeof(DB.Abstraction.cDAL).Assembly.Location;
strTargetDirectory = typeof(MvcApplication).Assembly.Location;
strTargetDirectory = System.IO.Path.GetDirectoryName(strTargetDirectory);
string strSourcePath = Server.MapPath("~/bin/dependencies/InstantClient");
string[] astrAllFiles = System.IO.Directory.GetFiles(strSourcePath, "*.dll");
foreach (string strSourceFile in astrAllFiles)
{
string strTargetFile = System.IO.Path.GetFileName(strSourceFile);
strTargetFile = System.IO.Path.Combine(strTargetDirectory, strTargetFile);
System.IO.File.Copy(strSourceFile, strTargetFile);
}
base.Init();
} // End Sub Init
afin de copier la DLL native à l'emplacement supposé correct. Mais je reçois toujours l'exception DllNotFound ...
Où ou comment dois-je mettre un dll natif dans une application ASP.NET?
Je répète: je ne peux pas définir les variables d'environnement, et je ne peux pas copier les DLL dans un dossier qui est dans path. (ce qui devrait normalement résoudre le problème).
Comme vous le voyez avec les multiples occurences de
strTargetDirectory =
J'ai essayé plusieurs, aucune des possibilités qui ont travaillé.
Tout ce que vous devriez avoir à faire pour mettre la DLL dans le dossier bin de votre application. Pourquoi essayez-vous d'accéder à la DLL séparément dans votre code Init()? – RickNZ
@RickNZ: Doit est bon. Mais ce n'est pas le cas. Mais je l'ai résolu maintenant. Solution ajoutée –
@RickNZ: ShadowCopy copie les DLL .NET dans un autre dossier, et s'exécute à partir de là.Ainsi, les DLL natives dans le dossier bin se trouvent dans un autre dossier et ne seront pas trouvées/chargées. –