Принудительный вызов GC.Collect
Есть .net класс. Этот класс создается в нативном коде при помощи создания COM-объекта.
Этот класс работает с внешними файлами. Так вот, эти файлы невозможно удалить даже после удаления созданного объекта. Я так понимаю, что причина в том, что даже после того, как на объект удалились все ссылки сам объект продолжает жить, пока его на вычистит сборщик мусора.
Вопрос - а можно ли как-то вызвать сборщик мусора из нативного кода?
Исходников класса нет.
Update
Декомпилировал сборку. Вот проблемный метод
public void SetImageSource(int index, string s)
{
if (this.markLayer2 == null || index >= this.markLayer2.Graphics.Count)
return;
PictureMarkerSymbol symbol = (PictureMarkerSymbol) this.markLayer2.Graphics[index].Symbol;
double num1 = 0.0;
double num2 = 0.0;
try
{
FileStream fileStream = new FileStream(s, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] numArray = new byte[fileStream.Length];
fileStream.Read(numArray, 0, (int) fileStream.Length);
symbol.SetSource(numArray);
symbol.YOffset = num2 / 2.0;
symbol.XOffset = num1 / 2.0;
}
catch (Exception ex)
{
}
}
После него файл блокируется. Я так понимаю, что проблема в отсутствии using для FileStream и никакими принудительными вызовами Dispose для внешнего объекта тут не обойдешься. Нужен именно принудительный вызов сборщика
Ответы (1 шт):
В идеале не использовать этот код! Но если нет выхода, попробуй создать FileStream по имени и закрыть его с помощью метода Close https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.close?view=netframework-1.1