2016-05-10 2 views
2

Фон: Я работаю над очень большим сюитом, который содержит около 12 различных суб-приложений. Моя цель - взять одно из этих подзадач и создать свой собственный исполняемый файл со всеми DLL-файлами, встроенными в EXE-файл. До сих пор я мог внедрить большинство DLL с помощью следующих шагов:System.IO.FileNotFoundException, возникающий в mscorlib.dll?

1) Добавьте библиотеки DLL в проект в локальной папке и установите их в «Встроенные ресурсы».

2) Добавить эти библиотеки DLL на вкладке Ссылки и установите копию локального свойства в Ложный

3) Добавить эти библиотеки DLL в Resources.resx файл

Я также создал новый файл Program.cs и установите точку входа в основную функцию, расположенную в желаемом сборочном узле. Моя проблема заключается в том, что DLL-файл, который используется для запуска всего пакета, не может быть встроен в EXE из субприложения, потому что я продолжаю получать исключение System.IO.FileNotFoundException в файле mscorlib.dll с фреймом стека, установленным в System.AppDomain.ExecuteAssembly , Однако я могу полностью исключить это исключение: я установил для свойства «Suite.dll» Copy Local значение true.

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

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
     { 
      string resourceName = new AssemblyName(args.Name).Name+".dll"; 

      string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName)); 

      using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource)) 
      { 
       Byte[] assemblyData = new Byte[stream.Length]; 
       stream.Read(assemblyData, 0, assemblyData.Length); 
       return Assembly.Load(assemblyData); 
      } 
     }; 

Можно ли это предотвратить? Как мне разрешить эту зависимость, чтобы я мог встраивать свой DLL-файл в свой подэкран EXE? Прошу прокомментировать, если требуется дополнительная информация, и я отредактирую вопрос. Благодаря!

ответ

2

Уменьшите свою основную функцию до установки AssemblyResolve, а затем вызовите другую функцию в другом классе, которая делает то, что у вас есть сейчас.

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

+0

Можете ли вы привести пример? Я думаю, что вижу вашу точку зрения, но я смущен, как это будет работать, потому что функция Main() никогда не вызывается до того, как произойдет исключение (проверяется путем размещения точки останова в начале функции). – LaneL

+0

Ваша точка останова ничего не проверяет. Прокомментируйте все, кроме привязки сборки, и оно будет волшебным образом достигнуто. – Joshua

+0

Спасибо, Джошуа, я ценю это. – LaneL

0

У меня была та же проблема, причина в том, что я случайно удалил Newtonsoft.Json.dll из папки моего проекта.

Смежные вопросы