Доступ к C ++ COM DLL из Webservice - PullRequest
1 голос
/ 13 июня 2011

Я использую COM DLL из веб-службы. COM DLL добавлен в качестве ссылки. И я объявляю объект как статический в Global.asax. Я создаю COM-объект в Application_Start.

Я должен вызывать функцию интерфейса COM DLL в каждом запросе. Я получаю исключения здесь как повреждение памяти. Я мог видеть журналы, которые происходят, когда одновременные запросы появляются Пожалуйста, дайте мне знать, как лучше всего это сделать. Как сделать это потокобезопасным .?

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

Если COM-объект является многопоточным, COM обеспечивает синхронизацию для принудительного выполнения одного метода для потока.

Как правило, COM должен жаловаться на то, что несколько потоков пытаются получить доступ к экземпляру объекта, используя один и тот же указатель, общий для всех потоков. Наличие статической переменной, содержащей указатель на объект, вероятно, плохая идея.

Как только общая библиотека COM-объектов загружается куда-либо (in-proc или out-of-proc) путем создания экземпляра, создание дополнительных экземпляров для каждого потока должно быть довольно быстрым. Это, конечно же, зависит от того, какие вещи делаются во время строительства объекта.

0 голосов
/ 13 июня 2011

Попробуйте создать новый экземпляр в каждом запросе и не используйте область приложения для объекта.


Если вы обращаетесь к нему в области приложения (например, через Application_Start), вам необходимо убедиться, что этобезопасно для многопоточности.Я не знаю, как библиотеки C ++ обрабатывают потоки, но вы можете управлять многопоточностью на уровне asp.net.

Например, для управления простым счетчиком уровня приложения код выглядит примерно так:

Application.Lock();
Application["SomeGlobalCounter"] =
   (int)Application["SomeGlobalCounter"] + 1;
Application.UnLock();

Для получения дополнительной информации вы можете захотеть увидеть страницу MSDN на Состояние приложения .

...