Я реализовал интерфейс IDispatch в C #.Это, в свою очередь, открывает неуправляемый интерфейс COM, который также предоставляет интерфейс IDispatch.
~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;
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что метод Finalize вызывается во время использования объекта во время обычного выполнения, что означает, что попытка позднее получить доступ к перенесенному интерфейсу не удалась.Когда я вынимаю код очистки, код работает нормально, но завершится сбоем, когда программа, использующая код, выйдет (у меня нет отладочной информации из вызывающего приложения, но, скорее всего, упакованный интерфейс не был удален).Я не знаю, как решить эту проблему, и думаю, что мое понимание неверно.Любые предложения будут ценны.
Объект инициализируется следующим образом:
private void InitialiseObject()
{
if (so == null)
{
so = Activator.CreateInstance(Type.GetTypeFromProgID("MyProgID));
}
}
Затем используется как:
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);
}
}
Суть всего этого в том, что интерфейс c # действует как проход черезкласс и может регистрировать информацию, передаваемую из стороннего приложения в интерфейс IDispatch.