2012-12-12 32 views
6

Próbuję uzyskać informacje o programach c + = za pośrednictwem kodu. Miałem pewne sukcesy z EnvDTE, teraz potrzebuję używać VCProject i VCCodeModel i mam problemy z rzutowaniem (mam nadzieję, że to wszystko ...)Nie można przesłać DTE, projektu lub rozwiązania do VCProject i VCCodeModel

W klasie robotniczej mam DTE "application" przekazany z Connect .

mam:

EnvDTE.Project project = application.SelectedItems.Item(1).Project; 
EnvDTE.Solution sol = (EnvDTE.Solution)application.Solution; 

Chciałbym użyć „projekt”, a nie pierwszy projekt w roztworze jako przykładów znalazłem w internecie - jak poniżej - ale przede wszystkim, chciałbym mieć coś, co działa jako pierwsze.

Dla VCProject próbowałem (off stronie internetowej Microsoftu, a wszystkie inne przykłady internetowych):

VCProject vcProject = (VCProject)application.Solution.Projects.Item(1).Object; 
MessageBox.Show(vcProject.ProjectDirectory); 

lub ... po prostu

VCProject vcProject = (VCProject)project.Object; 

Dla VCCodeModel, przetłumaczyłem do C# http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vccodemodel.vccodeinclude.aspx :

public void GetAllIncludes() 
{ 
    VCCodeModel vcCM = (VCCodeModel)application.Solution.Item(1).CodeModel; 
    foreach (VCCodeInclude vcInclude in vcCM.Includes) 
    { 
    MessageBox.Show(vcInclude.DisplayName); 
    }  
} 

Oba dają wyjątek:

"unable to cast com object of type 'system.__comobject' to interface type Microsoft.VisualStudio.VCCodeModel" 
"unable to cast com object of type 'Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCProjectShim' to type Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCProject" 

Jak mogę to ustawić? Najlepiej użyć "projektu" ... lub application.SelectedItems ... Czy to możliwe?

Czy ktoś może mi dać pomysł? Dziękuję Ci.

+0

wiem, że jestem dość późno w tutaj, ale może warto rzucić okiem na [mój post] (http://stackoverflow.com/questions/29951353/can-one-cast-an-envdte-project- into-a-vcproject? noredirect = 1 # comment48023756_29951353) – Kraven

Odpowiedz

1

Ten problem pojawia się, gdy próbujesz rzucić CodeModel do innej wersji VCCodeModel. Istnieje VCCodeModel.dll dla każdej wersji VS.

+1

Mam ten problem w pakiecie visual studio, który jest docelowy w studio wizualnym 2010, 2012, 2013 i 2015. Jedynym praktycznym rozwiązaniem wydaje się zdefiniowanie typów jako obiektu i polegać na późnym wiązaniu. –