Я пытаюсь сделать инструмент, похожий на Unity (очевидно, в более низком масштабе), и мне нужно будет скомпилировать скрипты, которые работают как в редакторе, так и в финальной игре.Ошибка сборки сборки C# при использовании ReferencedAssemblies
Мой подход к этому заключается в компиляции кода в редакторе с использованием ссылочной сборки моей исполняемой игры, в то время как исполняемый файл игры уже содержит все скрипты, которые присутствуют во время компиляции.
Однако у меня возникла проблема с частью редактора. В основном я установил
parameters.ReferencedAssemblies.Add ("path/to/Game.exe");
parameters.GenerateInMemory=true;
parameters.GenerateExecutable=false;
а затем скомпилировать. Там нет ошибки компиляции, но при попытке использовать
var typeArray=results.CompiledAssembly.GetTypes();
исключение ReflectionTypeLoadException брошено:
Could not load file or assembly 'Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
Однако копирование мой исполняемый Game.exe в каталог инструмента, а также изменение опорного узла к
parameters.ReferencedAssemblies.Add ("Game.exe");
позволяет мне скомпилировать и получить доступ к GetTypes без ошибок.
Итак, мои вопросы:
а) как я могу сделать GetTypes работать при использовании сборки, которая находится в другом каталоге? (примечание: я бы предпочел не добавлять путь к GAC, так как это должен быть общий инструмент)
b) возможно ли получить доступ к информации о типе без загрузки ссылочной сборки? Я имею в виду, что в NET 4.5 Type и TypeInfo предполагается разделить только по этой причине, не так ли?
CLR имеет довольно строгие правила о том, где именно он ищет зависимые сборки. Шансы, что он будет выглядеть в' path/to/', равны нулю, если это делается в« инструменте »и Инструмент не находится в том же каталоге, что и game.exe. Используйте Fuslogvw.exe, чтобы получить представление, используйте событие AppDomain.AssemblyResolve как возможную ленточную помощь. И подумайте, что исполняемый файл игры и инструменты, вероятно, не должны быть на расстоянии друг от друга. –
@Hans, мне жаль, что я не знал о [Fuslogvw.exe] (http://msdn.microsoft.com/en-us/library/e74a18c4) раньше - он звучит так, будто я мог бы сэкономить себе массу неприятностей в прошлом! –
Спасибо Hans, AssemblyResolve - это именно то, что я ищу – KakCAT