dll為VB6撰寫,我在dll的類中定義了一個GetHwnd方法回傳表單句柄。如下,方法回傳值之后,我已經不需要這個dll的資源了,但是當我洗掉dll之后會提示dll檔案被程式占用,所以請問各位大神,我怎么才能釋放Activator.CreateInstance之后占用的記憶體?(GetType這一句執行完之后dll還能洗掉,CreateInstance之后直到程式結束之前都無法洗掉)
以下代碼
private IntPtr GetHwnd()
{
IntPtr handle = (IntPtr)0;
Type obj = Type.GetTypeFromProgID("CSharpDll.StartClass");
object ins = Activator.CreateInstance(obj);
try
{
object result = obj.InvokeMember("GetHwnd", BindingFlags.InvokeMethod, null, ins, new object[] { "dll回傳表單", "000", "" });
handle = (IntPtr)result;
}
catch (Exception ex)
{
MessageBox.Show("LoadDll():" + ex.Message);
}
return (IntPtr)handle;
}
uj5u.com熱心網友回復:
一般的方法是沒法卸載,然后洗掉dll的只有AppDomain可以被卸載
需要新建一個AppDomain然后在其中載入dll,用完后卸載,才能夠洗掉dll
uj5u.com熱心網友回復:
AppDomain.CreateDomain創建域加載dll
AppDomain.Unload卸載域
uj5u.com熱心網友回復:
放在程式域中加載,卸載程式域仍然無法洗掉,不知道我這樣寫有沒有問題?class ProxyObject : MarshalByRefObject
{
int handel = -1;
public void Loaddll()
{
Type obj = Type.GetTypeFromProgID("CSharpDll.StartClass");
object ins = Activator.CreateInstance(obj);
try
{
object result = obj.InvokeMember("GetHwnd", BindingFlags.InvokeMethod, null, ins, new object[] { "dll回傳表單", "000", "" });
handel = (Int32)result;
}
catch (Exception ex)
{
MessageBox.Show("LoadDll():" + ex.Message);
}
MessageBox.Show("" + handel);
}
}
以下是呼叫:
ad = AppDomain.CreateDomain("DLL Unload test");
obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"WinFormDemo.exe", "WinFormDemo.DllInvoke.ProxyObject");
obj.Loaddll();
AppDomain.Unload(ad);
obj = null;
uj5u.com熱心網友回復:
感謝大哥,我已經使用程式域了,但還是沒有解決。
uj5u.com熱心網友回復:
感謝大哥,我已經使用程式域了,但還是沒有解決。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/146944.html
標籤:C#
上一篇:C#寫的winform程式視窗失去焦點時用mouse_event模擬滑鼠單擊失效
下一篇:打包
