У меня есть собственный (Delphi) COM-сервер, который объявлен как STA (Apartment Threaded Model).
Он содержит несколько алгоритмов, которые в некоторых случаях генерируют исключения переполнения. Эти исключения обрабатываются в коде, и все работает как надо, если я получаю доступ к COM-серверу с клиента в главном потоке.
Если клиент является нативным (Delphi), я могу получить доступ к серверу из нескольких потоков, если придерживаюсь правила, согласно которому объект, созданный в потоке, выполняет все свои вызовы методов из этого же потока.
Однако, если клиент является управляемым клиентом (проверено на Vb.NET и C #), если я установил ApartmentState потоков клиента на MTA, все работает нормально, но я получаю снижение производительности.
Этого я ожидаю, так как я полагаю, что COM должен делать некоторые покерные игры (то есть маршалинг), чтобы все были довольны.
Однако, если я изменю ApartmentState на STA и, таким образом, обеспечу прямое соединение между клиентом и сервером, клиент потерпит крах с ошибкой, обычно System.stackoverflowexception в CustomMarshallers.dll.
Если я устраню числа, вызывающие эти переполнения, у меня нет проблем.
Я могу обойти это, настроив алгоритмы, чтобы они не зависели от исключений (вероятно, как они должны были быть написаны в первую очередь), но я хотел бы понять причины, стоящие за этим.