Ссылки на динамически загруженные сборки в динамически скомпилированном коде - PullRequest
3 голосов
/ 27 мая 2011

У меня есть ситуация здесь в проекте .net, в котором я компилирую скрипты C # в сборки в памяти, используя CodeDomProvider.

В классе CompilerParameters, который я использую для компиляции, я ссылаюсь на некоторые сборки по названию (System.dll и та, которая является частью проекта), и пока все работает.Однако некоторые сценарии используют некоторый код (через интерфейс и полиморфизм), который находится в сборке, которая предварительно скомпилирована, но загружается динамически с диска (например, в виде плагина).В этой ситуации это не будет работать, и проблема в том, что я не знаю, как ссылаться на динамически загруженную сборку при динамической компиляции скрипта.

Если я помещаю свой скрипт в библиотеку классов и из этой библиотеки классов я ссылаюсь на сборку плагина, все работает нормально, но если я добавлю имя сборки плагина (файл dll)к ссылочным сборкам в CompilerParameters и динамической компиляции сценария впоследствии, сценарий выполняется, а код, который находится в dll плагина, - нет.

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

Спасибо!

Редактировать: Вот код для загрузки dll плагина:

        DirectoryInfo di = new DirectoryInfo(@".\Plugins");
        FileInfo[] files = di.GetFiles("*.dll");
        foreach (FileInfo fi in files)
        {
            try
            {
                //load all dll files from the app pack directory
                Assembly asm = Assembly.LoadFrom(fi.FullName);
                Assemblies.Add(asm);
                foreach (Type type in asm.GetTypes())
                {
                    try
                    {
                        object instance = null;
                        instance = Activator.CreateInstance(type);

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

        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        List<string> referenceAssemblies = new List<string>();
        referenceAssemblies.Add("System.dll");
        referenceAssemblies.Add("VFS.dll");
        foreach (Assembly asm in PluginManager.Instance.Assemblies)
        {
            referenceAssemblies.Add(asm.Location);
        }
        CompilerParameters compilerParameters = new CompilerParameters(referenceAssemblies.ToArray());

Это работает, если я не использую какой-либо класс, который является частью плагина.

1 Ответ

0 голосов
/ 30 мая 2011

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

@ Insipid - Спасибо за ваш вдохновляющий ответ, потому что ничего на самом деле не происходит, и именно это заставило меня заглянуть в другое место и увидеть проблему.

Код, который я вставил выше, прекрасно работает и может быть использован, если кто-то захочет реализовать такие механизмы в будущем.

...