Утечка в RuntimeBinder при использовании "динамического" ключевого слова с __ComObject
Кто-нибудь знает, есть ли способ предотвратить утечку памяти в RuntimeBinder при использовании "динамического" ключевого слова с экземплярами __ComObject в C#?
Я получил следующий код:
var t = Type.GetTypeFromCLSID(new Guid("BB06C0E4-D293-4f75-8A90-CB05B6477EEE"));
while (true)
{
dynamic o = System.Activator.CreateInstance(t);
Marshal.ReleaseComObject(o);
}
Это приводит к утечке экземпляров класса LocalVariableSymbol (и других из пространства имен Microsoft.CSharp.RuntimeBinder.Semantics).
Замена "динамического" на "объект", т.е.
object o = System.Activator.CreateInstance(t);
устраняет утечку, но я бы предпочел продолжать использовать динамический (фактический код намного сложнее и использует "динамический").
Я знаю, что синглтон RuntimeBinder кэширует данные, и это вызывает утечку, но знаете ли вы, есть ли способ очистить кэш и т. Д.?
Большое спасибо!
Похожие вопросы:
- Переполнение памяти: увеличивающееся количество Microsoft.CSharp.RuntimeBinder.Semantics
- Утечка памяти в классах CLR
Ссылки по теме:
2 ответа
Решением в моем случае было заменить:
dynamic o = System.Activator.CreateInstance(t);
с:
object o = System.Activator.CreateInstance(t);
dynamic d = o;
Утечка памяти больше не происходит с применением обходного пути.
У меня была похожая проблема: использование "динамического" вызвало утечку памяти.
Я решил это следующим образом:
using (dynamic attr = curve.Attributes)
{
if (attr != null)
return attr.InternalLabel;
}