1

参照される dll で Application.StartupPath を使用する場合、パスは 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

types には、MyType から派生したすべての型が含まれます。2 番目のパラメーターを True に変更して、GAC の検索を除外します。すべてのタイプのリストを取得するには、最初のパラメーターとして Nothing を渡します。

4

3 に答える 3

0

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

このソリューションは、豊富な情報が記載されている「方法: デザイン時のサービスにアクセスする」のコードに基づいています。

于 2010-01-24T12:28:29.700 に答える
-2

設計時にそれを行うことはできません! 実行時、つまり、アプリケーションをビルドして実行するとき、または VS 内で F5 キーを押すか、緑色の矢印をクリックするときに実行できます。設計時に知りたいのはなぜですか?実行可能ファイルとそれに関連する DLL は実際にはメモリに読み込まれて実行されないため、これは無関係です。さらに、コードに変更が加えられた場合は、プロジェクト全体を再構築する必要があります。

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-24T02:57:15.083 に答える