Получить ссылку на сборку из инструмента генерации кода - PullRequest
0 голосов
/ 05 ноября 2010

В настоящее время я реализую собственный генератор кода, который преобразует файлы конфигурации XML в классы C # в проекте Visual Studio. Я в основном придерживаюсь подхода, описанного в этом блоге: http://consultingblogs.emc.com/pauloreichert/archive/2005/05/21/1459.aspx

Однако генератор кода должен искать все доступные типы и их свойства внутри сборки, в которой используется генератор. Я хочу сделать это с помощью отражения, но проблема в том, что мне нужна ссылка на сборку, в которой можно искать типы.

Как получить ссылку на сборку проекта VS, в котором используется генератор кода?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2010

Я нашел решение. Действительно, из генератора кода можно получить ссылку на объект Visual Studio Project.

Я нашел код для получения ссылки на проект здесь: http://subversion.assembla.com/svn/mistral-framework/trunk/src/VisualStudio/Mistral.VisualStudio.XmlClassGenerator/BaseCodeGeneratorWithSite.cs

Затем следующий метод возвращает ссылку на объект сборки, который мы можем использовать для отражения всех доступных типов и т. Д. С помощью отражения.

private static Assembly GetAssembly(Project project, string assemblyName)
{
    Microsoft.VisualStudio.OLE.Interop.IServiceProvider oleSP = 
        project.DTE as Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
    ServiceProvider sp = new ServiceProvider(oleSP);

    DynamicTypeService dts = 
        sp.GetService(typeof(DynamicTypeService)) as DynamicTypeService;

    Microsoft.VisualStudio.Shell.Interop.IVsSolution sln = 
        sp.GetService(typeof(SVsSolution)) as IVsSolution;

    Microsoft.VisualStudio.Shell.Interop.IVsHierarchy hier = null;
    sln.GetProjectOfUniqueName(project.UniqueName, out hier);

    ITypeResolutionService rs = dts.GetTypeResolutionService(hier);
    return rs.GetAssembly(new AssemblyName(assemblyName), true);
}

Для метода по-прежнему требуется имя сборки, что хорошо в моем случае, поскольку я могу читать его из базового файла XML для генерации. Тем не менее, я уверен, что вы можете получить ссылку и без названия. (Я просто ленился и прекратил расследование, когда заставил его работать; -)

0 голосов
/ 05 ноября 2010

Обратите внимание, что для создания сборки Visual Studio необходимо скомпилировать код C #, который выводится вашим инструментом.Таким образом, в то время, когда ваш генератор кода запущен, сборка еще может не быть (если это произойдет, то есть чистая сборка).

...