C # / COM-взаимодействие работает только в отладчике - PullRequest
1 голос
/ 02 марта 2011

У меня проблема с COM-взаимодействием из приложения C # в компонент COM-сервера inproc.

Я сократил проблему до простой программы тестирования c #.Он создает экземпляр класса взаимодействия серверного компонента, устанавливает значение строки как свойство в экземпляре, а затем устанавливает другое свойство строки.Я не делаю ничего необычного с сортировкой.Просто используя класс взаимодействия, сгенерированный, когда я добавил ссылку на компонент COM.Что-то вроде:

using MyLib;  // Interop assy
// ...
MyComp comp = new MyComp();
comp.Prop1 = "abc";
comp.Prop2 = "xyz";

Результаты:

  • Если я запускаю тестовую программу вне VS, тогда, когда задано второе свойство, я последовательно получаю COMException сHRESULT 0x80010105 (RPC_E_SERVERFAULT).

  • Если я запускаю тестовую программу в Visual Studio 2005, она последовательно работает правильно.

Я написал эквивалентный код на неуправляемом C ++ (без atl, только простые указатели интерфейса), и это правильно работает как внутри, так и вне VS.

Мой вопрос : что отличается от средыв каком взаимодействии происходит при запуске внутри отладчика, который может объяснить то, что я вижу?Я предполагаю, что E_RPC_SERVERFAULT генерируется маршаллером взаимодействия, но почему только в отладчике?Любые предложения о том, как поступить с этим?

[Я не очень много говорил о компоненте com, потому что мой вопрос о различном поведении, которое я вижу в отладчике и из него.Компонент com хорошо протестирован и используется уже более 7 лет (тысячи вызовов в день в серверной среде), поэтому я в этом совершенно уверен.Это 32-битная DLL.У меня есть источник, но в настоящее время у меня нет подходящей среды для сборки.Даже если бы я это сделал, я не уверен, как отладить его из управляемого кода.Возможно ли это?]

ОБНОВЛЕНИЕ

Пока нет решения, но есть еще замечания:

  1. Я попытался запустить приложение от имени администратора,а также с выключенным UAC.Тот же результат.
  2. Я пытался подключиться к процессу до того, как произошла ошибка, но в окне вывода не было индикации появления структурированного исключения.
  3. Я попытался явно установить модель квартиры дляпроверить основной поток приложения на STA, а затем MTA, но это не имеет значения.COM-компонент является многопоточным.
  4. Я попытался запустить управляемое тестовое приложение (за пределами Visual Studio) на компьютере с Win2003 и на другом компьютере с Win7 pro.Он работал правильно на обоих.

Последний пункт указывает на проблему с моей машиной, но я не уверен, что.

[Среда - Framework 2.0, работающая на Win7 Pro32-разрядная версия с Visual Studio 2005 Pro.]

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Возможно ли, что вы используете сборку AnyCPU, и по какой-то причине Visual Studio загружает сборку как 32-битную, но когда вы запускаете программу вне VS, она запускается как x64 и, следовательно, не может загрузить 32-битную COM-DLL?

0 голосов
/ 29 апреля 2011

У меня такая же проблема. В моем случае принудительное использование 32-разрядного приложения .NET

    [STAThread]
    public static int Main(string [] args)

или (для темы)

   thread = new Thread(DoWorkUsingCOM);
   thread.SetApartmentState(ApartmentState.STA);
   thread.Start();

решил проблему.

...