Как использовать WebDev.WebServer.exe (VS Web Server) в x64?
Visual Studio - x86 до тех пор, пока по крайней мере не выйдет обновление 2010 года : это все еще проблема в VS2010, нет собственной поддержки 64-битной Cassini. Мой вопрос: кто-нибудь может придумать способ или знает независимый сервер отладки ASP.NET, который x64 для 2008 или 2010?
Справочная информация: наше приложение ASP.NET работает под управлением Oracle как БД. Поскольку мы находимся на 64-битных серверах из-за проблем с памятью позже, нам нужно использовать 64-битные драйверы Oracle (Instant Client).
Настроить:
- x64 OS (XP или Windows 7)
- IIS (6 или 7, оба x64 пула приложений)
- Oracle 64-bit Instant Client (отдельный каталог в PATH)
-
Visual Studio 2008 SP1Visual Studio 2010
В IIS пул приложений работает как 64-разрядный, использует драйверы Oracle по назначению, однако, поскольку WebDev.WebServer.exe является 32-разрядным, вы получите исключение BadImageFormatException, поскольку оно пытается загрузить библиотеки DLL 64-разрядных драйверов в 32-разрядных среда. Все наши разработчики хотели бы иметь возможность использовать сервер быстрой отладки через Visual Studio 2008, но, поскольку он работает как 32-разрядный, мы не можем. Некоторые проблемы, с которыми мы сталкиваемся, возникают при запуске приложения, поэтому, хотя иногда мы подключаемся к процессу IIS, этого недостаточно для отслеживания проблемы.
Есть ли альтернативы или обходные пути? Мы бы хотели максимально соответствовать нашим уровням Dev/Val/Prod, чтобы все, что работает в x64, было бы идеальным.
Обновление для VS 2010
Много изменений в этом вопросе с тех пор, как он был впервые опубликован, первый VS2010 вышел, у него все еще есть те же проблемы, но у проекта, над которым я работаю, нет. Чтобы решить эту проблему, мы прошли 2 изменения, поэтому я опубликую их в надежде, что это спасет кого-то еще от горя
Первое решение состояло в том, чтобы загрузить Oracle x86 в 32-разрядной версии, x64 в 64-разрядном режиме, мы сделали это, заменив ссылку на сборку при запуске под 64-разрядной версией через web.config, например:
<configuration>
<runtime>
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" processorArchitecture="amd64" />
<bindingRedirect oldVersion="2.0.0.0-10.9.9.9" newVersion="2.102.3.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Ключ здесь processorArchitecture="amd64"
это означает, что замена происходит только при работе под 64-битной версией.
Обратите внимание, что эти версии могут устареть (если вы читаете эту статью, посвященную Oracle), это было некоторое время назад. В дополнение к конфигу мы загрузили 32-битную и 64-битную версии Oracle.DataAccess
в GAC. 32-битные версии 10.xxx
для Oracle 10g 64-битные версии 2.1xxx
так что просто поменять привязку используя <assemblyBinding>
работает.
Второе, более долгосрочное решение полностью отошло от клиента Oracle, теперь мы используем dotConnect для Oracle для нашего поставщика Linq-to-SQL, и, поскольку он полностью управляет кодом с использованием прямого TCP-соединения, у нас больше нет 32/64-битный специальный код в приложении, который гораздо проще поддерживать.
Я надеюсь, что тот, кто найдет это, также найдет продолжение полезным. Если у вас есть вопросы по поводу того или иного решения, которое я в конечном итоге использовал, пожалуйста, прокомментируйте, и я постараюсь объяснить более подробно.
4 ответа
Две идеи:
- Cobble что-то вместе с XSP из проекта Mono.
- Тестирование в полностью 32-битной среде, развертывание в 64-битной среде.
Вы можете попытаться скомпилировать 64-битный Cassini из исходного кода.
Даже если вы используете 64-битную среду, временно обращайтесь к 32-битным библиотекам в Visual Studio (или вручную копируйте их в папку BIN), чтобы вы могли отладить их. Имейте в виду, что каждый раз, когда вы компилируете код, он будет повторно копировать 64-битные сборки в папке BIN.