2012-04-30 2 views
2

Я создал ComVisible .Net (C#) dll, которая содержит служебную ссылку. При попытке доступа к DLL из внешнего COM-клиента (VBScript) исключение генерируется всякий раз, когда я создаю объект.Новое ключевое слово для справки службы dll

Исключенное исключение - InvalidOperationException (0x80131509).

После короткого расследования я заметил, что он не справляется с созданием ссылочного объекта службы («новый»).

  1. Ссылка службы объекта, используемое имя в приведенном ниже коде ServiceClient
  2. ServiceClient является частным для C# DLL
  3. Попытка создать ссылку в конструктор также не
  4. Удаление «новой» ключевое слово как из класса или конструктор делает код пропуска,
  5. сервис и работает

библиотека DLL код:

namespace UIIdentifier.Updater 
{ 
    [ClassInterface(ClassInterfaceType.AutoDispatch)] 
    public class Client 
    { 

     [ComVisible(false)] 
      //<<--This throws the exception -->> 
     private ServiceClient uiSpySrv = new ServiceClient(); 

     [ComVisible(true)] 
     public string hello() 
     { 
      return "hello"; 
     } 
    } 
} 

Код клиента:

Dim oUpdater 
Set oUpdater = CreateObject("UIIdentifier.Updater.Client") 

MsgBox oUpdater.hello 

Любые предложения, почему это происходит?

+0

Какое исключение? –

+0

@JaredKells: InvalidOperationException (ID: 0x80131509) –

+0

Возможно, он пытается получить доступ к конфигурационному файлу, чтобы настроить инфраструктуру обмена сообщениями (например, получить соответствующий URL-адрес), а код вызывающего клиента не имеет файла конфигурации? –

ответ

0

Я успешно скомпилировал ваш код C# как библиотеку классов и зарегистрировал его с помощью COM. Я запустил пример сценария .vbs и появилось окно с текстом «hello»

Может ли конструктор ServiceClient или какой-либо код, вызываемый в конструкторе, вызывать исключение?

В моем примере проект ServiceClass был просто пустым классом.

 
    [ComVisible(false)] 
    public class ServiceClient{} 

Вы можете отлаживать COM библиотеку с помощью Visual Studio.

  • Откройте свойства для библиотеки классов
  • Выберите вкладку Debug и изменить время начала действия в: Пуск внешней программы.
  • Введите «c: \ windows \ system32 \ wscript.exe» в качестве внешней программы.
  • Введите путь к файлу vbs в качестве аргумента командной строки.

Перерыв на все исключения

  • в меню отладки в Visual Studio выберите исключение.
  • Отметьте брошенную коробку для каждого типа исключения.

Начать отладку. Visual Studio должна разорваться, когда вызывается исключение InvalidOperation, и затем вы можете проверить трассировку стека.

+0

Проблема заключается в использовании служебной ссылки. При использовании любого типа закрытого объекта, как вы, исключение не выбрасывается. Попробуйте установить ServiceClient как экземпляр внешней ссылки службы wcf. –

1

Наиболее вероятной причиной является отказ WCF от конфигурации службы из файла app.config.

Когда ваша библиотека загружается как объект COM, файл app.config не существует.

Лучше всего создать свой WCF-клиент в коде вместо использования файла конфигурации. Это довольно просто. Вы можете увидеть, как это делается здесь: WCF Configuration without a config file

Выполнение кода примера в отладчике с помощью службы WCF, настроенной в файле app.config, генерирует следующее исключение, которое, по моему мнению, довольно понятно.

System.InvalidOperationException произошло
Не удалось найти конечную точку по умолчанию элемент, ссылки контракт «ServiceReference1.IService1» в разделе конфигурации ServiceModel клиента. Возможно, это связано с тем, что файл конфигурации не найден для вашего приложения или , потому что ни один элемент конечной точки, соответствующий этому контракту, не найден в клиентском элементе .

+0

Кажется, он решил проблему. Но есть проблема с этой концепцией - жестко закодированные ценности вредят гибкости обслуживания, с одной стороны, а с другой - клиент, ссылающийся на класс lib с ссылкой на службу, которая содержит файл app.config, содержит данные о службах, которые сильно определяют реализацию сервиса для клиентов , в то время как клиенту все равно, как дела обстоят. –

+0

Я не уверен, что вы говорите. Либо вы хотите, чтобы клиент настроил службу, либо нет. Если вы этого не сделаете, они должны быть жестко закодированы внутри вашей COM-библиотеки в соответствии с моим ответом. Если вы хотите, чтобы они были настроены клиентом, вам необходимо предоставить интерфейс из вашего COM-объекта, который позволяет клиентам настраивать их. Файлы App.config и файлы манифеста являются частью платформы .NET, у ваших COM-клиентов нет возможности их загрузить. –

Смежные вопросы