Следует добавить ссылку на сборку system runtime
В данной теме описывается один из способов разработки простейшего распределенного приложения, которое использует удаленное взаимодействие между компьютерами в сети. По данному примеру можно научиться разрабатывать приложения, которые взаимодействуют между собой в локальной сети. Тема предусматривает наличие базовых навыков работы в Microsoft Visual Studio 2010.
Содержание
Поиск на других ресурсах:
Условие задачи
1. Разработать распределенное приложение, которое содержит следующие части:
- серверная часть. Сервер должен содержать функции решения математических задач. В данном случае, в качестве примера сервер содержит метод, который решает квадратное уравнение. Серверная часть должна быть разработана как консольное приложение;
- клиентская часть. Клиент содержит программный код, который получает результат из серверной части. Клиент вызывает функцию решения квадратного уравнения, которая реализована и выполняется на сервере. Клиентская часть должна быть разработана как приложение типа Windows Forms .
⇑
Соображения
Для проверки правильности выполнения задачи, нужно наличие как минимум двух компьютеров, которые объединенные между собой в локальную сеть.
Разработка распределенного приложения осуществляется на одном компьютере в MS Visual Studio 2010. Тестирование взаимодействия клиентской и серверной частей осуществляются также на одном компьютере.
После завершения тестирования, серверный код размещается на компьютере-сервере. Клиентский код из компьютера-клиента делает запрос на компьютер-сервер, получает ответ и выводит этот ответ на экран. В нашем случае клиентский код вызывает серверную функцию решения квадратного уравнения.
⇑
Выполнение
1. Запустить Microsoft Visual Studio 2010
⇑
2. Разработка общей сборки с метаданными
2.1. Что такое общая сборка?
Для того, чтобы клиент и сервер взаимодействовали между собой, нужно наличие еще одной части программного кода – общей сборки. Общая сборка содержит метаданные типов, которые являются допустимыми для удаленного вызова. Метаданные типов – это информация о типах данных, которые используются при удаленном вызове. Эта информация нужна как клиенту, так и серверу.
В конечном счете, после создания, программный код общей сборки должен размещаться как на компьютере клиента, так и на компьютере сервера. В противном случае, связь между клиентом и сервером невозможно будет установить.
⇑
2.2. Создание модуля общей сборки
В нашем случае общая сборка не является исполняемым файлом. Это есть библиотека, которая сохраняется в формате *.dll .
В Microsoft Visual Studio 2010 для создания библиотеки используется шаблон Class Library . В данном примере, чтобы создать модуль общей сборки нужно выполнить команду
Рис. 1. Создание библиотеки по шаблону Class Library
После выбора OK , создается проект, который содержит один файл Class1.cs . Листинг файла следующий:
По умолчанию создается класс с именем Class1 в пространстве имен ClassLibrary1 . В нашем случае оставляем все как есть. По желанию можно изменить название класса и пространства имен.
⇑
2.3. Текст модуля общей сборки
В модуль Class1.cs нужно ввести необходимый программный код. Этот код будет выполняться на стороне сервера. А вызов этого кода будет осуществлять клиент.
В соответствии с условием задачи, сервер может решать математические задачи. Поэтому, в класс Class1 нужно вписать функцию решения квадратного уравнения. В нашем случае функция называется CalcEquation() . По желанию, сюда можно вписать другие функции, которые решают разные задачи.
Также класс Class1 наследует данные и методы класса MarshalByRefObject . Класс MarshalByRefObject обеспечивает доступ к объектам в пределах домена приложения в приложениях, которые поддерживают удаленный доступ. Это специально разработанный класс для поддержки распределенного доступа к приложениям.
В классе MarshalRefObject есть метод CreateObjRef() , который будет использован в нашем проекте. Метод CreateObjRef() содержит всю необходимую информацию для генерирования прокси. Прокси применяется чтобы соединиться с удаленным объектом.
Листинг модуля общей сборки следующий (файл Class1.cs ):
⇑
2.4. Объяснение к методу решения квадратного уравнения
Метод решения квадратного уравнения CalcEquation() получает входными параметрами значения коэффициентов a, b, c. Если уравнение имеет решение, то метод возвращает true и значение корней уравнения в параметрах-переменных x1 , x2 . Если уравнение не имеет решения, то метод возвращает false и нулевые значения параметров-переменных x1 , x2 .
⇑
На этом шаге нужно откомпилировать проект командой
В результате будет создан *.dll -файл общей сборки с именем ClassLibrary1.dll, которая размещается в папке
Этот файл нужно будет разместить в папках с исполняемыми модулями на компьютере-клиенте и на на компьютере-сервере. Файл общей сборки готов.
Рис. 2. Файл ClassLibrary1.dll
⇑
2.6. Закрыть решение (проект)
Общая сборка разработана. Чтобы закрыть решение (Solution) нужно выполнить команду
На следующем этапе будет разрабатываться программный код серверной части распределенного приложения.
⇑
3. Создание программного кода, который будет размещаться на компьютере-сервере
После создания файла (модуля) общей сборки на одном и том же компьютере нужно разработать программный код, который будет размещаться на компьютере-сервере.
Чтобы сервер отвечал на запросы клиента, программный код серверной части должен быть запущен на выполнение в момент запроса.
3.1. Создание приложения типа Console Application
В соответствии с условием задачи, на серверной части нужно создать приложение типа Console Application . Это осуществляется стандартным способом с помощью команды
В результате откроется окно New Project (рисунок 3), в котором нужно:
Рис. 3. Окно создания консольного приложения
В результате будет создано обычное консольное приложение, которое содержит файл Program.cs . В этом файле объявляется пространство имен ConsoleApplication1 , в котором реализован класс Program .
Листинг файла следующий
⇑
3.2. Добавление ссылок на сборки
Чтобы использовать программный код общей сборки нужно подключить:
⇑
В результате откроется диалоговое окно Add Reference (рисунок 5), в котором нужно:
⇑
3.2.2. Добавление ссылки на сборку ClassLibrary1
В нашем случае выбирается папка (см. п. 2.4):
Рис. 7. Выбор папки и файла общей сборки
После выбора OK , в окне Solution Explorer в перечне References ссылок на использованные сборки появится сборка ClassLibrary1 .
Рис. 8. Сборка ClassLibrary1 в перечне сборок серверного приложения
⇑
После подключения сборок к проекту, нужно подключить необходимые пространства имен в файле Program.cs. Добавляются 4 пространства имен:
На данный момент текст файла Program.cs следующий
⇑
3.3. Написание кода серверной части
3.3.1. Действия, которые нужно выполнить на сервере
На компьютере-сервере нужно выполнить три основных действия:
⇑
3.3.2. Текст кода серверной части
Ниже приведен текст программного кода серверной части
Объясним некоторые фрагменты кода серверной части.
На третьем этапе нужно зарегистрировать сервис как WKO -тип ( Well Known Object ). Это реализуется с помощью класса RemotingConfiguration . В этом классе есть метод RegisterWellKnownServiceType() . Этот метод получает три параметра:
В конце вызывается метод Console.Readline() . Этот метод необходим, чтобы зафиксировать выполнение консольного приложения, поскольку серверная часть должна быть все время запущена. В это время клиенты смогут к ней обращаться. Завершение работы сервера – клавиша Enter .
⇑
3.4. Компиляция. Файлы серверной части
На этом шаге нужно откомпилировать текст командой
для получения исполняемого ( *.exe ) файла. В результате будет создан исполняемый файл с именем
На рисунке 9 отображено содержимое папки Debug с файлами проекта серверной части. Как видно из рисунка 9, автоматически подгружается файл общей сборки ClassLibrary1.dll .
Рис. 9. Содержимое папки Debug с исполняемым файлом ConsoleApplication1.exe серверной части и файлом сборки ClassLibrary1.dll
Оба файла ConsoleApplication1.exe и ClassLibrary1.dll нужно будет разместить (скопировать) на компьютере-сервере.
После этого проект, который соответствует серверной части, завершен.
⇑
4. Разработка приложения клиентской части
В сети с несколькими компьютерами, клиентов может быть сколько угодно, а сервер один. Сервер должен отвечать на запросы клиентов. В нашем случае достаточно разработать одно приложение, которое делает запросы к серверу. Затем исполняемый .exe файл (модуль) этого приложения и .dll файл общей сборки нужно скопировать (распространить) по всей сети на клиентские компьютеры.
4.1. Создание приложения клиентской части по шаблону Windows Forms
Проект по шаблону Windows Forms создается стандартным способом:
В результате откроется окно New Project . В окне New Project нужно выбрать вкладку
как показано на рисунке 10.
Рис. 10. Проект типа Windows Forms Application , который будет размещаться на компьютере клиента
В проекте задаются:
- имя проекта WindowsFormsApplication1 ;
- папка проекта D:\Programs .
После выбора OK будет создана новая форма проекта как показано на рисунке 11.
Рис. 11. Новая форма проекта
⇑
4.2. Проектирование формы
4.2.1. Размещение элементов управления Label , Button , TextBox на форме
Нужно разместить на форме следующие элементы управления (рисунок 12):
- четыре элемента управления типа Label . По умолчанию создаются объекты с именами label1 , label2 , label3 , label4 ;
- один элемент управления типа Button . По умолчанию создается объект с именем button1 .
Рис. 12. Размещение элементов управления на форме
⇑
4.2.2. Настройка свойств фомы и элементов управления
Подробное описание того, как осуществляется настройка элементов управления на форме можно найти в теме:
На этом шаге, с помощью окна Properties, нужно настроить следующие свойства формы и элементов управления:
После настройки элементов управления, окно формы будет иметь вид как показано на рисунке 13.
Рис. 13. Окно программы-клиента после настройки
После этого можно разрабатывать программный код клиента.
⇑
4.3. Текст модуля формы Form1.cs
Главной форме программы-клиента соответствует модуль (файл) с именем Form1.cs .
На данный момент листинг файла Form1.cs имеет следующий вид:
⇑
4.4. Алгоритм работы программы-клиента
На компьютере клиенте нужно выполнить следующие действия:
⇑
4.5. Написание программного кода клиентской части
4.5.1. Добавление ссылок на сборки
Для того, чтобы использовать код общей сборки, на компьютере-клиенте нужно подключить:
⇑
4.5.2. Подключение пространств имен
⇑
4.5.3. Написание кода метода Form1_Load()
Создание канала между сервером и клиентом в клиентской части будет выполняться только один раз. После того, как канал создан, многократно может вызываться метод CalcEquation() из серверной части.
Учитывая вышесказанное, целесообразно запрограммировать событие Load формы Form1 . Это событие вызывается в начале создания формы. В нашей программе этому событию соответствует обработчик Form1_Load() . В обработчике нужно разместить программный код создания канала, регистрации канала и создания отдаленного объекта.
Ниже приведен текст обработчика события Form1_Load() :
⇑
В вышеприведенном коде пока что задается общее имя нашего компьютера localhost . Если будет сеть, то это имя нужно будет заменить на компьютере-клиенте на сетевое имя компьютера сервера. Клиентский проект нужно будет снова перекомпилировать.
⇑
5. Тестирование взаимодействия между клиентом и сервером на одном компьютере без использования локальной сети
Тестирование взаимодействия между клиентом и сервером проводится на одном компьютере, который в системе носит имя localhost . После проведения тестирования это имя будет изменено на имя компьютера-сервера в сети.
Для проведения тестирования нужно:
- запустить серверное приложение (рисунок 15) из папки сервера (см. п. 3);
- запустить на выполнение клиентское приложение (рисунок 16) из папки клиента (см. п. 4);
- ввести в клиентское приложение данные и провести вычисления.
Рис. 15. Выполнение серверной части
Приблизительный результат выполнения клиентского приложения приведен на рисунке 16.
Рис. 16. Клиентская программа
Важно: если закрыть программу-сервер и попробовать провести вычисления на клиенте, то возникнет исключительная ситуация. Система не сможет найти приложение-сервер. Значит, для проведения тестирования, сервер должен все время выполняться.
Клиентов можно запускать сколько угодно и производить запросы к серверу.
⇑
6. Копирование серверной части на другой компьютер
На этом шаге нужно скопировать файлы ConsoleApplication1.exe и ClassLibrary1.dll на компьютер-сервер. Это осуществляется с помощью, например, обычного файлового менеджера. Файлы копируются в заведомо подготовленную папку.
⇑
7. Определение имени сервера в сети из компьютера-клиента
Если компьютеры объединены в локальную сеть, то каждый из них имеет свое уникальное имя. Способ определения имени компьютера в сети зависит от конкретной реализации операционной системы. В общем случае, чтобы определить это имя, нужно вызвать утилиту Control Panel (Панель управления). В этой утилите можно выбрать элемент System (Система). Откроется окно, в котором можно прочитать имя компьютера.
⇑
8. Корректирование клиентского программного кода. Замена имени localhost
Если известно имя компьютера-сервера в локальной сети, тогда нужно в клиентской части сделать изменения. В исходном коде файла Form1.cs в методе Form_Load() вместо строки
где MyComp – имя компьютера-сервера в локальной сети. Скорей всего у вас будет другое имя.
Итак, текст обработчика события загрузки формы в нашем случае следующий:
После этого нужно перекомпилировать клиентский проект, чтобы сформировать новый исполняемый модуль. На рисунке 17 изображен файл WindowsFormsApplication1.exe клиентского модуля. В этой папке также есть общая сборка ClassLibrary1.dll .
Рис. 17. Папка с клиентским исполняемым модулем WindowsFormsApplication1
⇑
9. Тестирование взаимодействия между клиентом и сервером на разных компьютерах, объединенных между собой в локальную сеть
На этом этапе нужно протестовать работу между клиентом и сервером на разных компьютерах, которые объединенные между собой в локальную сеть.
Для этого, нужно:
Важно: чтобы между клиентом и сервером было взаимодействие, компьютер-клиент должен иметь соответствующие права доступа к компьютеру-серверу. Например, на сервере может быть включен общий доступ к его ресурсам. Это все осуществляется соответствующими настройками на компьютере-сервере. В данной теме это не рассматривается.
делаю распределенное приложение (переписываю с книги за 2005г.) там требуется создать ссылку на сборку "SimpleRemotingAsm.dll" не могу разобраться как это сделать, строчки с тремя звездочками подчеркивает
ниже представлен текст клиентской сборки еще есть серверная и генеральная
Помощь в написании контрольных, курсовых и дипломных работ здесь
Как добавить ссылку на сборку System.Windows.Forms.DataVisualisation ?
Как добавить ссылку на сборку System.Windows.Forms.DataVisualisation? Стандартным способом.
Как корректно задать ссылку
Привет, друзья. Ситуация такова. Есть страница с дешевыми авиабилетами. Идея в том, что юзер.
Как задать ссылку на событие в массиве
Если контролы свести в массив, то доступ к ним можно организовать в цикле Dim mas(3) mas(0) =.
а почему подчеркивает эту строку
Добавлено через 7 минут
все спасибо нашел где добавить
осталось решить проблему с (SimpleRemotingAsm.RemoteMessageObject) почему-то подчеркивает
Добавлено через 1 минуту
просто ткнул по подсказке что-то связанное с объявлением класса и все стало нормально
его самого и это все напечатал все запускается но выдает ошибку Trying to create a proxy to an unbound type.
в строке
Как в css задать ссылку на другую страницу
Как в css задать ссылку на другую страницу? предположим есть див с классом 111, нужно написать.
Как задать свою ссылку на каждую картинку в слайдере
Подскажите, пожалуйста полный код слайдера из этой темы. У меня никак не выходит задать свою ссылку.
Как задать ссылку , чтобы открывался текст в ином div
Здравствуйте.Надо сделать так что бы при нажатии ссылки в одном div ,в другом div открывался текст.
Как впихнуть в одну ссылку два файла(через href) и каждому файлу задать своё направление (target)?
Как задать одной ссылке"<a>..</a>" два файла через "href" и каждому их этих файлов задать своё.
Как часть этого, я добавил ссылку на собственный пакет NuGet, который является переносимой библиотекой классов, и я думаю, что это создает проблему на сервере сборки.
TeamCity не выполняет сборку с помощью:
Я изначально добавил исправление для той же или подобной ошибки при компиляции веб-страниц Razor, которые исправлены в web.config
Однако проблема не решена.
Хотя этот файл в этом явном пути не существует на сервере сборки.
Да, ничего особенного в сборках фасадов на весь интернет.
Благодарю. Выше ссылка работала после установки 4.5.1 SDK. Теперь есть статья в КБ по поддержке Microsoft , посвященная этой теме. @PeterMajeed Вы действительно должны опубликовать этот комментарий в качестве ответа здесь. Большое спасибо за совет! Я должен был установить для параметра «Копировать локальный» значение true, чтобы это работалоЧтобы реализовать исправление, сначала разверните существующий раздел компиляции web.config, который по умолчанию выглядит следующим образом:
После расширения я добавил следующий новый XML-код конфигурации, когда мне было дано указание:
Окончательные теги web.config должны выглядеть так:
Эта проблема закралась в проект MVC, нацеленный на 4.52, не известный PCL, но много пакетов nuGet. Я считаю, что удаление VS2013 спровоцировало это, но я не знаю это как факт. Ошибка появилась только в представлениях, которые ссылаются на X-PagedList. Исправлено добавление ссылки на проект web.config (не views web.config). @GregTerrell У меня возникла именно эта проблема после обновления со старой версии X.PagedList. Так расстраивает. Добавление ссылки сработало, затем то, что я сделал, после закрытия проекта .vs (переименовало) папку .vs открыло ее, удалило запись web.config и теперь она собирается и работает нормально. @Mardoxx Ура, приятель. Я просто добавил ссылку, как в ответе выше. Все еще не нравится, но пока работает. Мне уже пришлось вручную исправлять средство выбора даты, которое я использовал, потому что текущий пакет nuget не работает: P. Я предполагаю обратную сторону зависимостей. Это работает, но теперь у меня есть еще одна сборка, и людям, возможно, придется добавить больше . она отлично компилируется на моем компьютере, но не в Azure. Я должен был также добавить System.Collections. Этот ответ решил мою ошибку. Добавлена ссылка в списке литературы и эта строка в web.config.Комментарий @PeterMajeed в принятом ответе помог мне с связанной проблемой. Я не использую переносимую библиотеку, но у меня такая же ошибка сборки при новой установке Windows Server 2012, где я использую TeamCity.
Есть идеи, что делать с 4.6? Я не вижу пакета разработчика вокруг. У меня есть и 4.5.1 и 4.5.2 пакеты разработчика, и я все еще получаю эту ошибку. Идеи? Я не хочу ссылаться на это во всех моих 25 проектах. По некоторым причинам другие 25 не требуют этого. Хорошие вопросы - я пока не имел дело с 4.5.2 или 4.6, по крайней мере, с точки зрения автоматизации сборки. Я думаю, если вы действительно застряли, вы всегда можете включить бесплатную версию Visual Studio Community Service Edition и поддерживать ее в актуальном состоянии. Я не понимаю, почему эти пакеты разработчика должны быть установлены. Я установил VS2013 Pro. Разве этого не достаточно? Но это решило проблему здесь. Благодарю. @MikedeKlerk у вас установлены все обновления VS? Это кажется очень странным - я ожидал, что это сработает. Я использовал пакет разработчика только потому, что у меня не было Visual Studio.Единственный способ, который работал для меня. Добавьте сборку в web.config
работает однострочно, не зависит от пути к библиотеке и не требует установки чего-либо, должно быть принято!) Этот ответ совпадает с ответом @Baahubali, получившим наибольшее количество голосов.Решение прост: Закройте решение и удалите скрытую папку .vs в той же папке, что и решение.
Добавление недостающих ссылок, как предлагается в других ответах, также решает проблему, но ошибка остается решена даже после удаления ссылок снова.
Что касается TeamCity, я не могу сказать, так как у моей конфигурации никогда не было проблемы. Но убедитесь, что вы reset рабочий каталог как часть усилий по отладке.
Мне нужно было загрузить и установить SDK Windows 8.0 (а не 8.1), чтобы ошибка исчезла на моем сервере TeamCity.
Пакет разработчика - это всего лишь две вещи, собранные вместе, но на сегодняшний день, похоже, не имеет версии 4.6, поэтому вам нужно будет установить два элемента отдельно.
Это решило это для меня.
.. и все же это сработало, для меня тоже. Нет выбора, поскольку папка . \ 45 \ . содержит только заглушку с именем _._После долгих поисков, переустановки 4.5.2 Developer Pack и ничего не работающего, я подумал, что это было просто несоответствие версии. Поэтому я просмотрел свойства каждого проекта, и одна из самых базовых библиотек была нацелена на 4.5, в то время как каждая другая была нацелена на 4.5.2. Я изменил этот параметр, который также нацелился на 4.5.2, и ошибки исчезли.
Наш проект никогда не сталкивался с этой проблемой, поэтому я скептически относился к изменению файлов конфигурации, прежде чем выяснил причину. Из журналов ошибок я смог найти этот подробный вывод компилятора, который указал на то, что действительно происходило:
Очевидно, что новый пакет, добавленный в наш проект, ссылался на более старую версию .NET Framework, вызывая проблему "определения в нескольких сборках" (CS1685), которая приводила к ошибке компиляции представления бритвы во время выполнения.
В рамках этого я добавил ссылку на собственный пакет NuGet, который представляет собой переносимую библиотеку классов, и я думаю, что это вызывает проблему на сервере сборки.
TeamCity не выполняет сборку из-за:
Первоначально я добавил исправление для той же или похожей ошибки при компиляции веб-страниц Razor, это исправление находится в web.config
Однако вопрос не решен.
Хотя этот файл по этому явному пути не существует на сервере сборки.
Я отправлю вам дополнительную информацию, как только найду документацию по PCL и этим фасадам.
Да почти ничего о сборках фасадов во всем Интернете.
Чтобы реализовать исправление, сначала разверните существующий раздел компиляции web.config, который по умолчанию выглядит следующим образом:
После расширения я добавил следующий новый XML-файл конфигурации, как мне было сказано:
Окончательные теги web.config должны выглядеть так:
Единственный способ, который у меня сработал - добавить сборку в web.config
Комментарий @ PeterMajeed в принятом ответе помог мне решить связанную с этим проблему. Я не использую переносную библиотеку, но у меня такая же ошибка сборки при новой установке Windows Server 2012, где я запускаю TeamCity.
Решение простое: Закройте решение и удалите скрытую папку .vs в той же папке, что и решение.
Добавление недостающих ссылок, как предлагается в других ответах, также решает проблему, но ошибка остается решенной даже после повторного удаления ссылок.
Что касается TeamCity, я не могу сказать, так как в моей конфигурации никогда не было проблем. Но убедитесь, что вы сбросили рабочий каталог как часть ваших усилий по отладке.
В мой файл .csproj решил проблему для меня.
Добавление предложенного <Reference устранило ошибку сборки ценой предупреждения об отсутствии ссылки (желтый треугольник на добавленной записи в дереве ссылок) в Visual Studio.
Наш проект никогда не сталкивался с этой проблемой, поэтому я скептически относился к изменению файлов конфигурации, прежде чем выяснил основную причину. Из журналов ошибок я смог найти этот подробный вывод компилятора, который указывал на то, что на самом деле происходило:
Я удалил несовместимый пакет (System.Collections.Immutable.dll), и проблема перестала возникать. Однако, если пакет не может быть удален в вашем проекте, вам нужно будет попробовать Ответ Баахубали.
Пакет разработчика - это всего лишь эти две вещи, связанные вместе, но на сегодняшний день, похоже, не имеет версии 4.6, поэтому вам придется устанавливать эти два элемента отдельно.
Это решило проблему для меня.
Мне нужно было загрузить и установить SDK для Windows 8.0 (а не 8.1), чтобы ошибка исчезла на моем сервере TeamCity.
После долгих поисков, переустановки пакета разработчика 4.5.2 и ничего не получилось, я подумал, что, возможно, это просто несоответствие версии. Итак, я посмотрел на свойства каждого проекта и обнаружил, что одна из базовых библиотек нацелена на 4.5, а все остальные - на 4.5.2. Я изменил его на 4.5.2, и ошибки исчезли.
Мне помогла только эта строка кода:
Assembly.Load("System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
Удаление ссылки через диспетчер пакетов Nuget и ее повторное добавление решило проблему для меня.
Я получаю следующую ошибку .
Я пробовал следующее:
Это ошибка? Есть ли обходной путь? Любая помощь приветствуется.
У меня была та же проблема, и я не нашел предлагаемых решений. Мое решение этой проблемы: проверьте App.config и packages.config, чтобы узнать, совпадают ли версии.
Первоначально мой app.config содержал:
Но файл packages.config содержал:
Я изменил запись app.config, чтобы она соответствовала packages.config для новой версии:
После изменения проблема была решена.
Я вытащил «4.3.0» из NuGet, но по какой-то причине VS настаивает на том, чтобы я ссылался на «4.1.2.0», у меня сработала аналогичная работа, только с другим номером версии . У меня была такая же проблема, как у @DavidRogers в проекте MSTest. Объединение различий между app.config и packages.config решило проблему. да, большое спасибо ! Это было решение для моего MSTest, который не нашел тестов [MSTest][Discovery] Failed to discover tests from assembly Reason:Could not load file or assembly 'System.Reflection, Version=4.1.1.0 etc Решение сработало для меня. Проблема началась после установки HtmlAgilityPack NUGET. И не запускался из-за неправильной информации о версии в пакетах. +1Приведенное ниже больше не нужно, оно было исправлено около VS 15.3:
Был известная ошибка VS2017 , особенно в NuGet 4.0.
NuGet 4.x приносит с собой «ссылку на пакет» - больше никаких пакетов.config, - но старый конвейер 4.x не был полностью обновлен на момент запуска VS2017. Приведенный выше фрагмент, кажется, «разбудит» систему сборки для правильного включения ссылок на пакеты из зависимостей.
Какое обновление Visual Studio 17? Можете указать версию? У меня все еще проблема в 15.5.5 VS2017. Похоже, есть и другие причины.Я недавно столкнулся с этой проблемой, и я пробовал много вещей, упомянутых в этой и других ветках. Я добавил ссылку на "System.Runtime" пакет для диспетчера пакетов nuget, исправил повторные привязки app.config и убедился, что app.config и package.config для сборки используется та же версия. Однако проблема не исчезла.
Наконец-то снял <dependentAssembly> бирку для сборки и проблема исчезла. Итак, попробуйте удалить следующее в вашем app.config .
Основываясь на вашем ответе, я проверил свои пакеты nuget и обнаружил, что между моими проектами требуется «Google.protobuf» (консолидация), Было бы полезно лучше объяснить, почему это сработает. Проблема с этим методом заключается в том, что всякий раз, когда вы обновляете какой-либо пакет nuget или добавляете новый пакет nuget, он будет добавлен снова.Я решил эту ошибку, сославшись на NetStandard.Library и следующий файл app.config в NUnit-Project.
редактировать
Редактировать 2
В новых версиях Visual Studio (я думаю, 2017 15.8) возможно, что Studio создаст файл app.config. Просто установите флажок Автоматически создавать перенаправления привязки в Project-Properties - Application .
Редактировать 3
Я исправил это, удалив app.config с помощью
app.config был автоматически добавлен (но не нужен) во время рефакторинга
Это сработало для меня! Обязательно попробуйте это, если все остальное у вас не работает<dependentAssembly> <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/> </dependentAssembly>
Я исправил свою ошибку, установив NetStandard.Library в свой проект модульного тестирования.
Мы обнаружили, что AutoGenerateBindingRedirects может быть причиной этой проблемы.
Замечено: один и тот же проект нацелен net45 и netstandard1.5 был успешно построен на одной машине и не был построен на другой. На машинах были установлены разные версии фреймворка (4.6.1 - успешно и 4.7.1 - неудачно). После обновления фреймворка на первой машине до версии 4.7.1 сборка также не удалась.
Загляните в это прямо сейчас в проекте модульного теста после добавления MsTest V2 через Nuget. Переименование app.config (столь эффективное его удаление) помогло мне.
но один пакет также добавил ту же сборку в зависимости от другой версии:
удаление тега «добавить сборку» из моего файла web.config решило проблему.
В app.config или web.config добавьте
Похоже, проблема возникает из-за конфликта версий между packages.config и app.config. В app.config у вас есть перенаправления привязки сборки, автоматически генерируемые функцией AutoGenerateBindingRedirects. Если этот параметр включен каждый раз, когда вы загружаете пакет nuget, он будет, помимо создания новой записи в packages.config, добавлять эту информацию о перенаправлении привязки в app.config. Какова цель этого, объясняется здесь: Перенаправление привязки сборки: как и почему?
Там вы можете прочитать, что написал пользователь @Evk:
Зачем вообще нужны привязки перенаправления? Предположим, у вас есть приложение A, которое ссылается на библиотеку B, а также на библиотеку C версии 1.1.2.5. Библиотека B, в свою очередь, также ссылается на библиотеку C, но версии 1.1.1.0. Теперь у нас конфликт, потому что вы не можете загружать разные версии одной и той же сборки во время выполнения. Чтобы разрешить этот конфликт, вы можете использовать перенаправление привязки, обычно к новой версии.
Итак, БЫСТРОЕ ИСПРАВЛЕНИЕ: удалите все записи в app.config.
В моем случае, просто благодаря этому программа начала работать, но она, вероятно, будет работать только в том случае, если у вас нет конфликтов версий одной и той же сборки во время выполнения.
Читайте также: