Ralf Meier Ответов: 1

Application. executablepath для компонента


Когда я спрашиваю где-то внутри моего приложения (возможно, в одной форме-скрипте) для " приложения.ExecutablePath" я получаю ответ :
'C:\Users\rmeier\documents\visual studio 2013\Projects\Rechte\Rechte\bin\Debug'

Это путь, который я хочу знать.

Если я спрашиваю то же самое внутри компонента, который помещен в ту же форму или модуль, я получаю ответ :
'C:\Program файлы (x86)\Microsoft Visual Studio 12.0\Common7\IDE'

Мне нужно получить тот же результат, что и описанный выше.
Я знаю, что существует разница между элементами управления и компонентами или модулями, а также что компоненты или модули непосредственно не принадлежат форме / приложению, но то, что приложение для компонента - это DevEngine, для меня совершенно ново.

Так... мой вопрос таков :
Как получить ExecutablePath из приложения внутри компонента или модуля ?

Что я уже пробовал:

Я также попробовал его с отражением из сборки " IO.Path.GetDirectoryName(Reflection.Собрание.GetExecutingAssembly.Местоположение)"
Но это также не дает правильного ответа.

1 Ответов

Рейтинг:
4

Ralf Meier

Это становится хорошим упражнением, чтобы задать вопрос и (потому что мне нужно решение) ответить на него самостоятельно (много ища и читая много статей)
Здесь то же самое ... но, возможно, в будущем этот ответ понадобится и кому-то еще ...

Ключевое слово - " DTE " - "среда инструментов разработки" для Visual Studio.
Для этого необходимо добавить к ссылкам "EnvDTE".
2-е Ключевое слово-DesignTime - во время выполнения методы из моего вопроса выше работают правильно.

Так... вот VB-код :

Function GetBuildFolder() As String

    Dim myDTE As DTE = Marshal.GetActiveObject("VisualStudio.DTE")
    Dim myProj As EnvDTE.Project = myDTE.Solution.Projects(0)

    Dim absoluteOutputPath As String
    Dim projectFolder As String

    Try
        ' Get the configuration manager of the project
        Dim configManager As EnvDTE.ConfigurationManager = myProj.ConfigurationManager

        If configManager IsNot Nothing Then

            ' Get the active project configuration
            Dim activeConfiguration As EnvDTE.Configuration = configManager.ActiveConfiguration

            ' Get the output folder
            Dim outputPath As String = activeConfiguration.Properties.Item("OutputPath").Value.ToString()

            ' The output folder can have these patterns:
            ' 1) "\\server\folder"
            ' 2) "drive:\folder"
            ' 3) "..\..\folder"
            ' 4) "folder"

            If outputPath.StartsWith(IO.Path.DirectorySeparatorChar & IO.Path.DirectorySeparatorChar) Then
                ' This is the case 1: "\\server\folder"
                absoluteOutputPath = outputPath

            ElseIf outputPath.Length >= 2 AndAlso outputPath.Chars(1) = IO.Path.VolumeSeparatorChar Then
                ' This is the case 2: "drive:\folder"
                absoluteOutputPath = outputPath

            ElseIf outputPath.IndexOf("..\") <> -1 Then
                ' This is the case 3: "..\..\folder"
                projectFolder = IO.Path.GetDirectoryName(myProj.FullName)

                Do While outputPath.StartsWith("..\")
                    outputPath = outputPath.Substring(3)
                    projectFolder = IO.Path.GetDirectoryName(projectFolder)
                Loop

                absoluteOutputPath = IO.Path.Combine(projectFolder, outputPath)

            Else
                ' This is the case 4: "folder"
                projectFolder = IO.Path.GetDirectoryName(myProj.FullName)
                absoluteOutputPath = IO.Path.Combine(projectFolder, outputPath)

            End If

            Return absoluteOutputPath

        End If

    Catch ex As Exception
    End Try

    Return ""

End Function


Karthik_Mahalingam

5

Ralf Meier

Спасибо, Картик