Насколько мне известно, специальных ограничений памяти для дотнет нет. То есть, твой процесс может свободно работать с объемами памяти гораздо большими, чем 300 мегабайт.
Сама ошибка говорит о том, что кто-то полез в область памяти, для него не предназначенную. Анменеджед код, конечно.
Иными словами, где-то есть баг в этих самых COM-библиотеках, видимо, либо просто не отслеживают память, что, впрочем, тоже баг.
А ошибку тебе вываливает сама винда, которая за работой с памятью строго следит и пресекает попытки лезть не туда, куда надо.
По поводу оптимизации памяти и т.д. - нет, для managed-объектов это up to CLR где и как размещать объекты, когда их убивать, когда дефрагментировать кучи и т.д. Ты этим управлять не можешь никак.
Для unmanaged-кода действуют "обычные" правила.
Инструмент для _работы_ с .net-памятью только один, GC, и его лучше не пинать
Есть всяческие профайлеры памяти для дотнета, которые могут показать тебе что, где и сколько занимает, в каком поколении GC находится и т.д.
Поищи в гугле по .NET Memory Profiler.