J'ai développé une application C# qui utilise DLL interop à une application de base de données externe.C# -Mon application et interopérabilité (DLL/COM) avec une application externe
Cette application externe démarre en même temps que mon application C# et est disponible tant que mon application C# est en cours d'exécution.
Maintenant, la vraie question est liée à la gestion des objets que j'ai besoin de créer pour interagir avec l'application externe. Lorsque je déclare des objets disponibles à partir des DLL référencées, ces objets ont des méthodes qui fonctionnent avec des fichiers (propriétaires) et exécutent des requêtes (comme si elles l'avaient été avec cette interface utilisateur externe). Ces objets sont détruits « par moi » en utilisant Marshal.ReleaseComObject(A_OBJECT)
tandis que d'autres fonctionnent dans un domaine d'application diferent, en utilisant AppDomain.CreateDomain("A_DOMAIN")
, effectuer les opérations et appeler un AppDomain.Unload("A_DOMAIN")
, libérant les DLL utilisées pour l'opération ...
Ces solutions de contournement sont faits pour assurez-vous que cette application externe ne "bloque" pas les fichiers utilisés dans ces opérations, permettant ainsi leur suppression ou leur déplacement depuis un dossier.
par exemple.
private static ClientClass objApp = new ClientClass();
public bool ImportDelimitedFile(
string fileToImport,
string outputFile,
string rdfFile)
{
GENERICIMPORTLib import = new GENERICIMPORTLibClass();
try
{
import.ImportDelimFile(fileToImport, outputFile, 0, "", rdfFile, 0);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(import);
import = null;
}
}
public int DbNumRecs(string file)
{
if (!File.Exists(file))
{
return -1;
}
System.AppDomain newDomain = System.AppDomain.CreateDomain();
COMMONIDEACONTROLSLib db = new COMMONIDEACONTROLSLibClass();
try
{
db = objApp.OpenDatabase(file);
int count = (int)db.Count;
db.Close();
objApp.CloseDatabase(file);
return count;
}
catch (Exception ex)
{
return -1;
}
finally
{
System.AppDomain.Unload(newDomain);
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
Ces deux «solutions» ont été obtenues par essais et erreurs, étant donné que je ne possède aucun type de manuel API. Ces solutions sont-elles correctes? Pouvez-vous m'expliquer les différences? Ai-je vraiment besoin de travailler avec les deux solutions ou devrait-on suffire?
Merci!
Merci, je vais essayer la solution postée par @James, je pense que c'est plus propre pour mon but. Merci – Libas