我一直在开发一个使用 DLL 与外部数据库应用程序互操作的 C# 应用程序。
这个外部应用程序与我的 C# 应用程序同时启动,并且只要我的 C# 应用程序正在运行就可用。
现在真正的问题与管理我需要创建以与外部应用程序交互的对象有关。
当我声明可从引用的 DLL 中获得的对象时,这些对象具有对文件(专有)进行操作并运行一些查询的方法(例如,是否通过此外部应用程序 GUI 执行此操作)。这些对象被“我”销毁,Marshal.ReleaseComObject(A_OBJECT)
而其他对象在不同的应用程序域中运行,通过使用AppDomain.CreateDomain("A_DOMAIN")
,执行操作并调用AppDomain.Unload("A_DOMAIN")
,释放用于操作的 DLL...
这些变通方法是为了确保此外部应用程序不会“阻止”这些操作中使用的文件,因此允许从文件夹中删除或移动它们。
例如
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();
}
}
这两个“解决方案”都是通过反复试验达到的,因为我没有任何类型的 API 手册。这些解决方案是否正确?你能解释一下不同之处吗?我真的需要同时使用这两种解决方案还是一个就足够了?
谢谢!