Отсутствует добавленная ссылка при использовании компилятора CodeDom

Я нашел похожие вопросы к этому, но не смог найти что-то, что конкретно решает мою проблему.

У меня есть код, который редактирует книгу Excel через System.CodeDom.Compiler, Это важно, так как я хочу иметь возможность "подключать" различные инструкции по редактированию для разных рабочих книг позже.

Ссылка на Microsoft.Office.Interop.Excel.Dll была добавлена ​​в мой проект с помощью References>Add... в visual studio, и я добавил ссылку на dll excel для компилятора CodeDom, используя .ReferencedAssemblies.Add следующее:

CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);

CompilerParameters compilerParams = new CompilerParameters();
compilerParams.GenerateInMemory = true;
compilerParams.GenerateExecutable = false;
compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.Dll");
compilerParams.ReferencedAssemblies.Add("Microsoft.Office.Interop.Excel.Dll");

Но, к сожалению, эта ошибка происходит:

{ошибка CS0006: файл метаданных 'Microsoft.Office.Interop.Excel.Dll' не найден}

Есть ли простой способ сказать компилятору CodeDom, чтобы найти эту DLL?

я пытался compilerParams.ReferencedAssemblies.Add(typeof(Microsoft.Office.Interop.Excel.Application).Assembly.Location); как предложено в другом месте, но это только указывает на скомпилированную программу exe, а не требуемую DLL.

Спасибо, Джо.

1 ответ

Это может быть не ответ, но это слишком много для комментария и может помочь в качестве "обходного пути".

Мне удалось загрузить System.Data.dll, которая НЕ была частью хостинг-сборки. Я поместил его в исполняемую папку "bin" вручную, просто для тестирования. Моя ошибка была довольно очевидной, которую я использовал:

String pathToDll = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

чтобы получить базовый каталог этой библиотеки. Но я получил URI (файл:///C:/...). После разбора на "C:\..." все прошло хорошо.

Поскольку ваша dll не может быть найдена, вы можете отредактировать свойства этой ссылки и установить "CopyLocal = true", чтобы dll оказался в том же пути, что и.exe. После этого вы сможете загрузить его:

String pathAndFile = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;    
pathAndFile = Path.GetDirectoryName(pathAndFile);
Uri uri = new Uri(pathAndFile);
pathAndFile = uri.LocalPath + "\\" + "Microsoft.Office.Interop.Excel.Dll";
compilerParams.ReferencedAssemblies.Add(pathAndFile);

Также взгляните на этот маленький кусочек кода, он должен загружать все из сборки хостинга. (Предупреждение: вы не можете загрузить одну сборку дважды в одном домене приложений)

var assemblies = AppDomain.CurrentDomain
                       .GetAssemblies()
                       .Where(a => !a.IsDynamic)
                       .Where(a => !parameters.ReferencedAssemblies.Contains(a.Location))
                       .Select(a => a.Location);

parameters.ReferencedAssemblies.AddRange(assemblies.ToArray());

И, насколько я прочитал, эти два урока немного устарели (код с ограничениями), но помогли мне понять немного больше:

https://west-wind.com/presentations/DynamicCode/DynamicCode.htm https://weblog.west-wind.com/posts/2016/Dec/12/Loading-NET-Assemblies-out-of-Seperate-Folders

Другие вопросы по тегам