Я делаю приложение, которое почти выполнено, но есть одна вещь, которая меня прослушивает. Для запуска приложения требуется около 12-13 файлов, которые должны находиться в каталоге папки (некоторые .dll, некоторые .xml-файлы и т. Д.), И я хочу сделать мое приложение максимально компактным, что означает, что я хочу как меньше файлов для работы с приложением. Итак, мой вопрос: как я могу это сделать? Могут ли все файлы быть включены в приложение? Нужно ли, чтобы .dlls находились в папке приложения или я могу ссылаться на них из другого места? Я думал создать папку для всех этих файлов, но я не думаю, что мое приложение будет запущено, если файл .dll не будет помещен в тот же каталог, что и приложение.Ссылка на файлы
ответ
How to embed and access resources by using Visual C# выглядит как раз то, что вам нужно.
[править] Если вы хотите загрузить DLL-библиотеки, вы можете объединить выше с AppDomain.AssemblyResolve
SLaks событий упоминается как это:
using System.IO;
using System.Reflection;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve +=
new ResolveEventHandler(MyResolveEventHandler);
var myWrappedClass1 =
currentDomain.CreateInstance(
"ConsoleApplication3.ClassLibrary1.dll",
"ClassLibrary1.Class1");
var myClass1 = myWrappedClass1.Unwrap();
Console.WriteLine(myClass1.GetType().InvokeMember(
"Add",
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
myClass1,
new object[] { 1, 1 }));
Console.ReadLine();
}
private static Assembly MyResolveEventHandler(
object sender, ResolveEventArgs args)
{
Assembly currentAssembly=null;
Stream dllStream;
try
{
currentAssembly = Assembly.GetExecutingAssembly();
dllStream =
currentAssembly.GetManifestResourceStream(args.Name);
var length = (int)dllStream.Length;
var dllByteArray = new byte[length];
int bytesRead;
int offset = 0;
while ((bytesRead = dllStream.Read(
dllByteArray,
offset,
dllByteArray.Length - offset))
> 0)
offset += bytesRead;
return Assembly.Load(dllByteArray);
}
catch
{
Console.WriteLine("Error accessing resources!");
}
return null;
}
}
}
где Class1
является библиотека классов, содержащая только:
namespace ClassLibrary1
{
public class Class1
{
public int Add(int x, int y)
{
return x + y;
}
}
}
и DLL добавляется в качестве встроенного ресурса в файл:
Если пример, который они приводят, недостаточно актуальен, дайте мне знать, какую версию .NET вы разрабатываете, и я приведу вам пример кода. –
Можете ли вы также сделать это с .DLL-файлами? Я знал, что вы можете встраивать ресурсы таким образом, но в свойствах ничего не отображается, когда вы щелкаете правой кнопкой мыши и выбираете свойства файла .dll. Кроме того, я использую .NET Framework 4.0 – david
Привет, Дэвид, пожалуйста, дайте мне знать, если этот пример делает его более понятным. –
Заканчивать this post
Microsoft предоставляет средства для этой цели
Вы можете обрабатывать AppDomain.AssemblyResolve
event и вызвать Assembly.Load(path)
для загрузки библиотек DLL из нестандартных папок.
Вы даже можете позвонить Assembly.Load(byte[])
, чтобы загрузить DLL, встроенную в ваш EXE, в качестве ресурса.
Обратите внимание, что JITTER загрузит все типы, используемые методом до начала запуска метода (для компиляции метода).
Поэтому вы должны добавить обработчик событий, прежде чем использовать какие-либо методы или типы в DLL, а метод, который добавляет обработчик, не может напрямую использовать библиотеки DLL.
Спасибо за информацию! Я еще не играл с событиями AssemblyResolve, но теперь я вижу, каким будет мой проект на выходные. :-) –
Похоже, вы можете использовать Embedded Resources для части этого файла (все, кроме DLL). Вы можете использовать ILMerge, чтобы объединить ваши сборки после компиляции, у ILMerge есть некоторые ограничения ...
- 1. Ссылка на файлы (php)
- 2. Неопределенная ссылка на файлы
- 3. pod2html: ссылка на другие файлы
- 4. Ссылка на внешние файлы edmx
- 5. Ссылка на файлы в Android
- 6. Ссылка на файлы внутри JAR
- 7. Ссылка на другие файлы нефрита
- 8. Ссылка на файлы в GCC
- 9. Ссылка на файлы сценариев из MVC
- 10. Ссылка на внешние файлы в рубине?
- 11. Ссылка на файлы в приложении iPad
- 12. Ссылка на файлы HTML в chrome App
- 13. Ссылка на файлы JavaScript из тестов Jasmine
- 14. ссылка на js-файлы в rails app
- 15. Ссылка на файлы .jar в NetBeans
- 16. Ссылка на загруженные файлы в MVC5?
- 17. Локальная ссылка на файлы общих файлов Dropbox
- 18. Ссылка на файлы из другого решения
- 19. Ссылка на файлы ROOT в xCode
- 20. Динамическая ссылка на файлы ресурсов в C#
- 21. Ссылка на файлы ресурсов из вида бритвы
- 22. PHP - более умные файлы Ссылка
- 23. Ссылка на бинарные файлы симуляторов iOS на OSX
- 24. Ссылка на локальные файлы (cdvfile: //) на iOS PhoneGap 3.3
- 25. Автоматическая ссылка на файлы классов внутри App_Code и ссылки на файлы классов за пределами App_Code
- 26. Неопределенная ссылка на c
- 27. SWF-ссылка на CD
- 28. Назад Ссылка Ссылка (ссылка на последней страницу)
- 29. Ссылка на статические файлы над родительским каталогом в колбе
- 30. Ссылка на общие файлы за пределами точек домена
Если вы перейдете на страницу вашего профиля, вы увидите ряд вопросов без принятых ответов. (Те, у кого количество ответов в белом, в отличие от желтого). В каждом из этих вопросов нажмите полый флажок рядом с наиболее полезным ответом. – SLaks