Добрый день! Как работает Marshal.ReleaseComObject()?
Это объект которую использую.
public class Object1C : IDisposable
{
private bool _disposed = false;
public Object1C(dynamic value)
{
Value = value;
}
public dynamic Value { get; private set; }
public Type Type => Value.GetType();
private void ReleaseUnmanagedResources()
{
if (_disposed) return;
Marshal.ReleaseComObject(Value);
_disposed = true;
}
public void Dispose()
{
ReleaseUnmanagedResources();
GC.SuppressFinalize(this);
}
~Object1C()
{
ReleaseUnmanagedResources();
}
}
метод который создает COM соединение с 1с
public void Open()
{
Type comconnector = Type.GetTypeFromProgID("V83.COMConnector");
if(comconnector == null)
throw new Exception1c($"COM Class Object \"V83.COMConnector\" was not found or not registered in the system");
try
{
IV8COMConnector connectorInstance = (IV8COMConnector)Activator.CreateInstance(comconnector);
Object1C = new Object1C(connectorInstance.Connect(ConnectionArgs.ToString())); // Здесь создается объект
}
catch (Exception ex)
{
throw new Exception1c($"{ex.Message}\r\n{ConnectionArgs}");
}
}
Ну в общем это для того чтобы автоматически выгрузить неуправлямые ресурсы. Если явно вызвать Dispose тогда програмка работает корректно. Если явно не вызвать просто вылетает appcrashом но при этом Dispose вызывается и в финализаторе тоже.
static void Main(string[] args)
{
var connection = new Connection1C(new ConnectionArgs("srv", "erp", "Админ", ""));
connection.Open();
connection.Object1C.Dispose();
}
Не могу понят в чем проблема.