Не могу ссылаться на dll в консольном приложении, но могу в wpf

  • У меня есть консольное приложение и приложение wpf.
  • в обоих приложениях я добавил ссылку на skype4com.dll

  • Код: SKYPE4COMLib.Skype oSkype = new SKYPE4COMLib.Skype();

дает: InvalidCastExeption заявляя:

Не удалось преобразовать COM-объект типа «System.__ComObject» в тип интерфейса «SKYPE4COMLib.Skype». Эта операция завершилась неудачно, так как вызов QueryInterface компонента COM для интерфейса с IID "{B1878BFE-53D3-402E-8C86-190B19AF70D5}" завершился неудачно из-за следующей ошибки: такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

но когда я запускаю ту же строку кода в своем приложении wpf, я не получаю исключения. Зачем!?


Мое консольное приложение работало отлично, пока не обновился скайп. Я удалил скайп, установил его снова, чтобы попытаться решить проблему, но это не помогло.


person Tono Nam    schedule 16.01.2012    source источник


Ответы (2)


Не используйте профиль клиента для своего консольного приложения, установите для него полную версию .Net.

Вы меняете его, зайдя в свойства проекта -> Приложение -> Целевая платформа (раскрывающийся список) -> Установите его на .Net Framework 4 (если это та версия .net, которую вы используете)

person Mharlin    schedule 16.01.2012
comment
Это исправило это для моего консольного приложения, но не для моего приложения .asp. Я думал, что если это будет работать в моем консольном приложении, то оно будет работать и в моем приложении asp. 1 час назад он работал хорошо, пока скайп не обновился. - person Tono Nam; 16.01.2012

После долгих часов попыток я решил, что собираюсь сделать мое wpf-приложение консольным, добавив необходимые ссылки и классы. Затем я сравнил и заметил, что если добавить:

[System.STAThreadAttribute()]

к основному способу работает!!!!!

в результате мой основной метод теперь должен выглядеть так:

с помощью системы; используя System.Collections.Generic; с помощью System.Linq; используя System.Text;

namespace ConsoleApplication3
{

    class Program
    {
        [System.STAThreadAttribute()]                
        static void Main(string[] args)
        {
            SKYPE4COMLib.Skype oSkype = new SKYPE4COMLib.Skype();
        }
    }
}

на asp.net нет основного метода. ну не тот, о котором я знаю. поэтому в asp.net мне пришлось добавить атрибут AspCompat, равный true.

поэтому мои страницы asp.net aspx теперь выглядят так:

    <%@ Page AspCompat="true" Language="C#" .... etc
person Tono Nam    schedule 17.01.2012