C#でIDispatchインターフェイスを実装しました。また、アンマネージCOMインターフェイスが開き、IDispatchインターフェイスも公開されます。IDispatch COMインターフェイスをラップするc#インターフェイスの廃棄
~MyObject()
{
Logger.TraceDebug("About to clean up object");
CleanupObject();
}
private void CleanupObject()
{
lock (lock_so)
{
try
{
if (so != null)
{
Logger.TraceWarning("Releasing object");
Marshal.FinalReleaseComObject(so);
}
}
catch (Exception e)
{
}
so = null;
}
}
私がいる問題は、オブジェクトが失敗包まれたインタフェースにアクセスするには、後にしようとする通常の実行の意味中に使用されている間、ファイナライズが呼び出されていることです。クリーンアップコードを取り出すと、コードは正常に動作しますが、コードを使用しているプログラムが終了すると失敗します(呼び出し元のアプリケーションからデバッグ情報はありませんが、ラップされたインターフェイスは破棄されている可能性があります)。私はこの問題にどのように対処し、私の理解が間違っていると考えているかについては迷っています。どんな提案も大歓迎です。
目的は、以下に初期化される:このすべての点は、C#インターフェースはクラスを通過するときに作用するとログインできる
public void DoSomething(string String)
{
try
{
lock (lock_so)
{
Object[] args = new Object[1];
args[0] = String;
so.GetType().InvokeMember("DoSomething", BindingFlags.InvokeMethod, null, so, args);
}
}
:
private void InitialiseObject()
{
if (so == null)
{
so = Activator.CreateInstance(Type.GetTypeFromProgID("MyProgID));
}
}
は次にように使用しました情報は第三者アプリケーションからIDispatchインターフェイスに渡されます。
このオブジェクトの使用方法を投稿できますか?また、フルクラスはいいね – cadrell0
私は少し混乱しています。オブジェクトを廃棄した後、ラップされたインタフェースにアクセスしようとしているのはなぜですか?または、おそらくこの質問は、「終了する前にFinalizeを呼び出しているオブジェクトがなぜ呼び出されているのですか」と言い換えることができます。 – Chris
@Chris私はそれをやろうとしていません - 私のクラスは、サードパーティのアプリケーションと情報をログに記録する基礎となるインターフェースの間にあります。それは単にメソッドと呼ばれています。 –