Доброго времени суток.
Хочу локализованные ресурсы моей библиотеки (dll) хранились в подкаталоге .\resources, находящемся рядом с этой dll.
Разрабатываемая библиотека является плагином к некоторому хостовому приложению и размещается не в его каталоге (либо подкаталогах), поэтому воспользоваться XML элементом probing конфигурационного файла хостового приложения не получится.
Написал код, обрабатывающий событие AppDomain.ResourceResolve:
// 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:
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);
}
На выходе вижу следующую информацию:
output |
---|
ResourceResolve event occured... Assembly 'C:\public\sfsp\resources\default\sfsp.resources.dll' loaded. |
Т.е. видно, что файл ресурсов найден и загружен. Однако локализованные сообщения, которые должны были выводиться в коде метода PrintHelloMessage отсутствуют. Я ожидал, что найдя ресурс, код продолжит своё выполнение и выведет все локализованные сообщения. Однако что-то не так... Почему так происходит?
Спасибо.