powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Размещение локализованных ресурсов плагина в спец. подкаталоге
3 сообщений из 3, страница 1 из 1
Размещение локализованных ресурсов плагина в спец. подкаталоге
    #38614206
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Хочу локализованные ресурсы моей библиотеки (dll) хранились в подкаталоге .\resources, находящемся рядом с этой dll.

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

Написал код, обрабатывающий событие AppDomain.ResourceResolve:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
// Static constructor
static ExtensionApplication() {
  curDomain = AppDomain.CurrentDomain;
  curDomain.ResourceResolve += curDomain_ResourceResolve;
}

static Assembly curDomain_ResourceResolve(object sender,
  ResolveEventArgs args) {
  Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  if (doc == null) {
    return null;
  }
#if DEBUG
  doc.Editor.WriteMessage("ResourceResolve event occured...\n");
#endif
  Assembly exAsm = Assembly.GetExecutingAssembly();
  Assembly result = null;
  String dirName = Path.Combine(Path.GetDirectoryName(exAsm.Location),
    "resources");
  if (!Directory.Exists(dirName)) {
    doc.Editor.WriteMessage("Directory '{0}' was not found.\n", dirName);
    return null;
  }
  else {
    CultureInfo culture = Thread.CurrentThread.CurrentUICulture;
    String resDirName = Path.Combine(dirName, culture.Name);
    if (!Directory.Exists(resDirName)) {
      resDirName = Path.Combine(dirName, culture.TwoLetterISOLanguageName);
    }
    if (!Directory.Exists(resDirName)) {
      resDirName = Path.Combine(dirName, "default");
    }
    if (!Directory.Exists(resDirName)) {
      doc.Editor.WriteMessage("Localized directories of necessary " +
        "resources was not found.\n");
      return null;
    }
    String fn = Path.GetFileNameWithoutExtension(
      Assembly.GetExecutingAssembly().Location);
    String resFileName = Path.Combine(resDirName,
      String.Format("{0}.resources.dll", fn));
    if (!File.Exists(resFileName)) {
      doc.Editor.WriteMessage("File '{0}' was not found.\n", resFileName);
      return null;
    }
    try {
      result = Assembly.LoadFrom(resFileName);
      doc.Editor.WriteMessage("Assembly '{0}' loaded.\n", resFileName);    
    }
    catch (Exception ex) {
      doc.Editor.WriteMessage("{0}\n", ex.Message);
      String.Format("Assembly '{0}' not loaded\n", resFileName);
    }
    return result;
  }      
}


При загрузке библиотеки, автоматически выполняется код метода Initialize:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public void Initialize() {
  Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  if (doc == null) {
    cad.DocumentManager.DocumentActivated += DocMng_DocumentActivated;
    return;
  }
  else {
    PrintHelloMessage(doc.Editor);
  }
}

private void PrintHelloMessage(Ed.Editor ed) {
  if (ed == null)
    return;
  ResourceManager res = new ResourceManager(GetType());
  String loadedMsg = res.GetString("LoadedMsg");
  String copyright = res.GetString("Copyright");
  String about = res.GetString("About");

  ed.WriteMessage(loadedMsg, GetType().Assembly.Location);
  ed.WriteMessage("\n{0}", copyright);
  ed.WriteMessage("\n{0}\n\n", about);

  res.ReleaseAllResources();
}

void DocMng_DocumentActivated(object sender,
  Ap.DocumentCollectionEventArgs e) {
  cad.DocumentManager.DocumentActivated -= DocMng_DocumentActivated;
  PrintHelloMessage(e.Document.Editor);
}



На выходе вижу следующую информацию:
outputResourceResolve event occured...
Assembly 'C:\public\sfsp\resources\default\sfsp.resources.dll' loaded.
Т.е. видно, что файл ресурсов найден и загружен. Однако локализованные сообщения, которые должны были выводиться в коде метода PrintHelloMessage отсутствуют. Я ожидал, что найдя ресурс, код продолжит своё выполнение и выведет все локализованные сообщения. Однако что-то не так... Почему так происходит?

Спасибо.
...
Рейтинг: 0 / 0
Размещение локализованных ресурсов плагина в спец. подкаталоге
    #38614259
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В отладчике дохожу до строки кода
Код: c#
1.
String loadedMsg = res.GetString("LoadedMsg");


в методе PrintHelloMessage, после чего выполняется код обработчика событий curDomain_ResourceResolve, но
по завершению обработки, выполнение кода в методе PrintHelloMessage не продолжается.
...
Рейтинг: 0 / 0
Размещение локализованных ресурсов плагина в спец. подкаталоге
    #38614563
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для наглядности набросал hello world (проект прикреплён ниже) для демонстрации проблемы: локализованный ресурс найден и загружен, но всё равно получаю исключение.

...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Размещение локализованных ресурсов плагина в спец. подкаталоге
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]