Домен приложения в функции Azure - PullRequest
0 голосов
/ 11 мая 2018

Я попытался создать домен приложения в функциях Azure для запуска ненадежного кода. Создание домена, кажется, работает нормально, но когда я пытаюсь загрузить сборки, кажется, что они загружаются неправильно.

Сначала я попробовал простой домен приложения:

public class Sandboxer
{
    public void Run()
    {
        AppDomain newDomain = AppDomain.CreateDomain("name");
        var obj = newDomain.CreateInstance(typeof(OtherProgram).Assembly.FullName, typeof(OtherProgram).FullName).Unwrap();
    }
}

public class OtherProgram : MarshalByRefObject
{
    public void Main(string[] args)
    {
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        foreach (var item in args)
            Console.WriteLine(item);
    }
}

Я получил ошибку

"System.IO.FileNotFoundException: не удалось загрузить файл или сборку" Песочница, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = 2cd9cb1d6fdb50b4 'или одна из ее зависимостей. Системе не удается найти указанный файл. "

Затем я попытался установить appliactionBase в папку с моей DLL в ней.

public class Sandboxer
{
    public void Run()
    {
        var location = typeof(OtherProgram).Assembly.Location;
        AppDomainSetup ads = new AppDomainSetup();
        ads.ApplicationBase = Path.GetDirectoryName(location);
        AppDomain newDomain = AppDomain.CreateDomain("name", null, ads);
        var obj = newDomain.CreateInstance(typeof(OtherProgram).Assembly.FullName, typeof(OtherProgram).FullName).Unwrap();
        var other = obj as OtherProgram;
        var other2 = obj as MarshalByRefObject;
    }
}

public class OtherProgram : MarshalByRefObject
{
    public void Main(string[] args)
    {
        Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
        foreach (var item in args)
            Console.WriteLine(item);
    }
}

В этом случае «other» является нулем в конце метода Run (), но «other2» является __TransparentProxy. Кажется, что он находит и загружает dll, но не понимает тип.

Как я могу исправить эту проблему? Спасибо!

Крест размещен здесь: https://social.msdn.microsoft.com/Forums/azure/en-US/59b119d8-1e51-4460-bf86-01b96ed55b12/how-can-i-create-an-appdomain-in-azure-functions?forum=AzureFunctions&prof=required

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

В этом случае «other» является нулем в конце метода Run (), но «other2» является __TransparentProxy.Кажется, что он находит и загружает DLL, но не понимает тип.

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

Для функции Azure obj as OtherProgram всегда возвращает значение NULL.Затем я попытался создать экземпляр OtherProgram в текущем домене следующим образом:

var obj=AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap(typeof(OtherProgram).Assembly.Location, typeof(OtherProgram).FullName);
OtherProgram op = obj as OtherProgram;
if (op != null)
    op.PrintDomain(log);

Приведенный выше код может работать, как и ожидалось, но я не нашел, почему объект в новом AppDomain всегда возвращает ноль.Вы можете попытаться добавить проблему в Функции Azure / Azure .

0 голосов
/ 16 мая 2018

Домены приложений не могут использоваться с функциями Azure. Чтобы правильно выполнить код песочницы в функциях Azure, необходимо создать новое приложение функций Azure и запустить там код.

Если вы разрешаете пользователям писать сценарии, вы можете использовать другой язык, например Lua, который позволяет легко выполнять песочницу.

0 голосов
/ 11 мая 2018

Это то, как я сделал бы это в обычном приложении .NET, должно работать в функциях Azure:

  1. Зарегистрируйтесь в событии AppDomain.AssemblyResolve во вновь созданном домене приложений
  2. В обработчике событий определите путь сборки, используя Каталог функций / Каталог приложений функций , чтобы указать на папку bin
...