Как получить путь приложения во время разработки в winforms, .net? - PullRequest
1 голос
/ 24 января 2010

Если вы используете Application.StartupPath в dll, на который ссылаются, путь указывает на путь IDE.

Есть ли способ получить путь к реальному приложению?

Просто чтобы прояснить, это во время разработки.

ETA: я разместил решение ниже:

ETA2:

Поскольку это связано, я подумал, что выложу фрагмент еще одного полезного сервиса времени разработки. Как и решение ниже, этот пример для UITypeEditor:

Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object

    Dim typeDiscovery As ITypeDiscoveryService = TryCast(provider.GetService(GetType(ITypeDiscoveryService)), ITypeDiscoveryService)
    Dim types As ICollection = typeDiscovery.GetTypes(GetType(MyType), False)

End Function

типы будут содержать все типы, полученные из MyType. Измените второй параметр на True, чтобы исключить поиск в GAC. Передайте Nothing в качестве первого параметра, чтобы получить список всех типов.

Ответы [ 3 ]

0 голосов
/ 24 января 2010

Вот как это сделать из UITypeEditor.

ETA: в исходном коде есть дополнительный ненужный шаг. Я забыл, что у нас есть сервис-провайдер, поэтому не нужно заглядывать на сайт. Упорядоченный код:

Public Class MyEditor
    Inherits UITypeEditor

    Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object

        Dim typeRes As ITypeResolutionService = TryCast(provider.GetService(GetType(ITypeResolutionService)), ITypeResolutionService)
        Dim ass As System.Reflection.AssemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName()
        MessageBox.Show(ass.CodeBase, "Design-time Path")
        MessageBox.Show(typeRes.GetPathOfAssembly(ass), "Run-time Path")

    End Function

End Class

Оригинальный код:

Public Class MyEditor
    Inherits UITypeEditor

    Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object

        Dim component As IComponent = TryCast(context.Instance, IComponent)
        Dim site As ISite = component.Site
        Dim typeRes As ITypeResolutionService = TryCast(site.GetService(GetType(ITypeResolutionService)), ITypeResolutionService)
        Dim ass As System.Reflection.AssemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName()
        MessageBox.Show(ass.CodeBase, "Design-time Path")
        MessageBox.Show(typeRes.GetPathOfAssembly(ass), "Run-time Path")

    End Function

End Class

Это решение основано на коде Как получить доступ к службам времени разработки , где вы найдете множество информации.

0 голосов
/ 24 января 2010

Вы не можете сделать это во время разработки! Во время выполнения вы можете, то есть когда вы создаете приложение и запускаете его, или нажимаете F5 в VS или нажимаете зеленую стрелку. Почему вы хотите знать во время разработки? Это не имеет значения, поскольку исполняемый файл и связанные с ним библиотеки DLL не загружаются в память и не выполняются; кроме того, в случае внесения изменений в код весь проект придется перестраивать заново.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...