2015-02-15 5 views
0

Я пытаюсь сделать инструмент, похожий на 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 предполагается разделить только по этой причине, не так ли?

+3

CLR имеет довольно строгие правила о том, где именно он ищет зависимые сборки. Шансы, что он будет выглядеть в' path/to/', равны нулю, если это делается в« инструменте »и Инструмент не находится в том же каталоге, что и game.exe. Используйте Fuslogvw.exe, чтобы получить представление, используйте событие AppDomain.AssemblyResolve как возможную ленточную помощь. И подумайте, что исполняемый файл игры и инструменты, вероятно, не должны быть на расстоянии друг от друга. –

+0

@Hans, мне жаль, что я не знал о [Fuslogvw.exe] (http://msdn.microsoft.com/en-us/library/e74a18c4) раньше - он звучит так, будто я мог бы сэкономить себе массу неприятностей в прошлом! –

+0

Спасибо Hans, AssemblyResolve - это именно то, что я ищу – KakCAT

ответ

1

Что касается вашей точки а): «как я могу сделать GetTypes работать при использовании сборки, которая находится в другом каталоге

Я думаю, вы могли бы использовать Assembly.LoadFrom Method (String) загрузить сборку из другой директории?.

что касается вашей точки б): «? будет ли возможность получить доступ к информации типа без загрузки ссылочных сборок»

Я не уверен, что вы сможете получить доступ к информации о типе без загрузки его в моде, но знаете ли вы, что loading Assemblies into the Reflection-Only Context?

Контекст загрузки только для отражения позволяет просматривать сборки, скомпилированные для других платформ или для других версий .NET Framework. Код, загруженный в этот контекст, может быть проверен только; он не может быть выполнен. Это означает, что объекты не могут быть созданы, поскольку конструкторы не могут быть выполнены. Поскольку код не может быть выполнен, зависимости не загружаются автоматически. Если вам нужно их изучить, вы должны загрузить их самостоятельно.

Во втором чтении вашего вопроса, как «game.exe» получает ссылку в вашем файле проекта?

Если это случай MSBuild нуждающегося, чтобы скопировать его в выходной сборки папку проекта, вы можете добавить «GAME.EXE в качестве элемента проекта, установите build action„Нет“и Copy to Output Directory Property в» Копировать if newer ".

+1

Привет, Вай Ха Ли, exe выбирается во время исполнения, поскольку редактор должен работать для нескольких проектов без перекомпиляции, поэтому, к сожалению, я не могу использовать Copy to Output. Я буду проверять контекстную нагрузку только для отражения, поскольку это может быть альтернативный способ сделать то, что мне нужно. Благодаря! – KakCAT