Почему я получаю ошибку привязки сборки в программе IIS CGI - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть программа на C #, которая работает как приложение CGI в IIS на XP Pro SP3.Он работает нормально, пока я не ссылаюсь на класс сборки библиотеки и не использую его в коде программы.Если я запускаю программу CGI вручную, она загружается и выполняется.Но когда он запускается IIS, ссылочная сборка не может быть привязана, несмотря на то, что она находится в том же каталоге, что и родительский исполняемый файл.Вот журнал привязок, который я получаю:

=== Pre-bind state information ===
LOG: User = STEVIENEW\IUSR_STEVIENEW
LOG: DisplayName = VOEvent, Version=3.0.7.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file://?/C:/Documents and Settings/Robert B. Denny/My Documents/iis/vomsgtst/
LOG: Initial PrivatePath = NULL
Calling assembly : MsgChkCGI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file://?/C:/Documents and Settings/Robert B. Denny/My Documents/iis/vomsgtst/VOEvent.DLL.
LOG: Attempting download of new URL file://?/C:/Documents and Settings/Robert B. Denny/My Documents/iis/vomsgtst/VOEvent/VOEvent.DLL.
LOG: Attempting download of new URL file://?/C:/Documents and Settings/Robert B. Denny/My Documents/iis/vomsgtst/VOEvent.EXE.
LOG: Attempting download of new URL file://?/C:/Documents and Settings/Robert B. Denny/My Documents/iis/vomsgtst/VOEvent/VOEvent.EXE.

База приложений верна (хотя что такое «?» В URI, может быть, это подсказка).Сборка voevent.dll определенно находится в том же каталоге (Appbase!), Что и MsgChkCGI.exe.И если я просто дважды щелкну по исполняемому файлу, он корректно запускается (и имеет ошибку из-за отсутствия переменной среды CGI, но это ожидаемо).

Ответы [ 3 ]

3 голосов
/ 19 февраля 2010

Я не уверен, почему это может произойти.

В качестве обходного пути вы можете обработать AppDomain.CurrentDomain.AssemblyResolve

EDIT : обратите внимание, что если вы используете типы из другой сборки в том же методе, который добавляет обработчик, событие не сработает, поскольку сборка будет загружена JITter перед кодом в метод фактически выполняется.
Поэтому вам нужно поместить любой код, который использует типы из других сборок, в отдельный метод, а затем вызвать этот метод после обработки AssemblyResolve.

2 и РЕДАКТ. : вызов Assembly.Load(File.ReadAllBytes(path)).
Кроме того, вы можете отредактировать свой вопрос, включив в него все детали FileNotFoundException из Assembly.LoadFile?

1 голос
/ 16 июня 2016

На основании ответа SLaks я написал решение

Assembly assembly = Assembly.GetEntryAssembly();
Uri codeBaseUrl = new Uri(assembly.CodeBase);
// hack IIS CGI malformed url
if (codeBaseUrl.ToString().StartsWith("file:///?/"))
    codeBaseUrl = new Uri("file:///" + codeBaseUrl.ToString().Substring(10));
string dir = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath);
dir = Path.GetDirectoryName(dir);

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    var dllName = new AssemblyName(args.Name).Name + ".dll";
    dllName = Path.Combine(dir, dllName);

    return Assembly.LoadFile(dllName);
};

Однако в других частях .NET происходит сбой из-за неверно сформированного URL-адреса file:///?/, поэтому я хотел бы узнать, как заставить URL-адрес не изменять пароль. Пропустить обычный URL-адрес

0 голосов
/ 16 июня 2016

Другим решением является запуск процесса с помощью EXE из другого CGI, например, из PHP, anotehr EXE или CMD.

Чтобы использовать * .cmd в качестве CGI, введите простой сценарий CMD, который запускает EXE

@echo off
%~dp0\myprogram.exe

И настроить IIS для запуска CMD как CGI.Сделайте то же самое, что и для файла EXE, просто введите CMD в правильных настройках.Затем перейдите к Mappings Handler , выберите CGI-exe и измените *.exe на *.cmd.Наконец, перейдите на панель CGI и измените Использовать новую консоль ... на True .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...