Kamil Kliczbor @ asptip.net

31May/090

Dynamiczne wczytywanie Assembly i błąd "Could not load file or assembly"

Scenariusz tym razem wygląda następująco:
w solucji projekty: IDAL - interfejsy dla DAL, DaoFactory - wzorzec fabryki abstrakcyjnej dla całego DAL oraz Model - klasy modelowe, a także Tests - projekt testów jednostkowych.
Z poziomu projektu testów zostały dodane referencje do wszystkich niezbędnych projektów. Dllki znajdują się w katalogu bin/debug. Test:

[TestMethod]

public void CanSaveTag() {

   ITagDao tagDao = ChPortalFactory.CreateTagDao();

   Tag tag = new Tag { Name = "Testowy"};

   bool result = tagDao.Add(tag, 2);

   Assert.IsTrue(result);

}

wyrzuca wyjątek System.IO.FileNotFoundException: Could not load file or assembly (ChPortal.Model).

Klasa fabryka abstrakcyjnej wczytuje dynamicznie Assembly:

public static ITagDao CreateTagDao() {

   string className = DBConnectionString.WebDAL + ".TagDao";

   return (ITagDao)Assembly.Load(DBConnectionString.WebDAL).CreateInstance(className);

}

Pierwsze poszukiwania zacząłem od tego, czy na pewno dllki znajdują się w katalogu testów, potem zacząłem debugować test. Okazało się, że wszystko gra do momentu tworzenia instancji klasy TagDao. No ale co to miało wspólnego w klasą modelową? Otóż, jeżeli klasa TagDao odwołuje się do innego assembly, to również to assembly musi zostać dynamicznie załadowane.
Najpierw zacząłem szukać w necie i znalazłem dosyć duży wpis na blogu, który znajduje się pod tym adresem.
Ale co bardziej ciekawe, to właśnie narzędzie Assembly Binding Log Viewer (Fuslogvw.exe) umożliwiło mi znalezienie błędu.

Ech.. okazało się, że niepotrzebnie dodałem [assembly: AssemblyCulture("pl-PL")], więc Activator poszukiwał tego assembly w katalogu bin/debug/pl-PL.