DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33461 / inTopicNo.1)  dllのパス
  
□投稿者/ 又三郎 一般人(1回)-(2016/08/25(Thu) 15:14:52)
  • アイコン環境/言語:[Windows7,64bit,VB2008,NET3.5] 
    分類:[.NET] 

    参照設定しているdllのパスを取得する方法を教えて下さい。
    
    例えばc:\testフォルダに.NETで作成したA.dllがあり
    dll内には以下の関数があります。
    
    Public Class Class1
     Public Shared Function mypath() As String
            Return ?????
        End Function
    End Class
    
    呼び出し側のプロジェクトでA.dllを参照設定して
    Class1.mypathを実行した場合、c:\testを返したい。

引用返信 削除キー/
■33463 / inTopicNo.2)  Re[1]: dllのパス
□投稿者/ 魔界の仮面弁士 大御所(1045回)-(2016/08/25(Thu) 19:58:06)
  • アイコンNo33461に返信(又三郎さんの記事)
    > 参照設定しているdllのパスを取得する方法を教えて下さい。

    アプリケーション ドメインに対して、アセンブリが動的にロードされた場合、
    DLL を表す物理パスが存在しないこともありえそうです。特殊なケースですが。


    > 呼び出し側のプロジェクトでA.dllを参照設定して
    > Class1.mypathを実行した場合、c:\testを返したい。

    掲示板左上の [HOME] から、[.NET プログラミング Tips]と辿り、
    [ファイル、フォルダ] - [パス] の項にある
    [自分のアプリケーションの実行ファイルのパスを取得する]
    のサンプルが役に立つかも知れません。
引用返信 削除キー/
■33465 / inTopicNo.3)  Re[2]: dllのパス
□投稿者/ 又三郎 一般人(2回)-(2016/08/25(Thu) 20:35:03)
  • アイコン
    魔界の仮面弁士様、ありがとうございます。
    サンプルをすべて試しましたが、期待する結果が得られません。
    dllを"C:\test\ClassLibrary1\ClassLibrary1\bin\Release\ClassLibrary1.dll"に置いて、以下を実行してみました。
    希望する結果は"C:\test\ClassLibrary1\ClassLibrary1\bin\Release"を返したいです。
    
    'ClassLibrary1.dll
    Public Class Class1
        Public Shared Function mypath1() As String
            Return System.Reflection.Assembly.GetExecutingAssembly().Location
        End Function
        Public Shared Function mypath2() As String
            Return System.Reflection.Assembly.GetExecutingAssembly().CodeBase
        End Function
        Public Shared Function mypath3() As String
            Return System.Reflection.Assembly.GetExecutingAssembly().EscapedCodeBase
        End Function
        Public Shared Function mypath4() As String
            Return System.Reflection.Assembly.GetEntryAssembly().Location
        End Function
        Public Shared Function mypath5() As String
            Return System.Reflection.Assembly.GetEntryAssembly().CodeBase
        End Function
        Public Shared Function mypath6() As String
            Return System.Reflection.Assembly.GetEntryAssembly().EscapedCodeBase
        End Function
        Public Shared Function mypath7() As String
            Return System.Windows.Forms.Application.ExecutablePath
        End Function
        Public Shared Function mypath8() As String
            Return System.Windows.Forms.Application.StartupPath
        End Function
        Public Shared Function mypath9() As String
            Return My.Application.Info.DirectoryPath
        End Function
        Public Shared Function mypath10() As String
            Return System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
        End Function
        Public Shared Function mypath11() As String
            Return System.IO.Path.GetDirectoryName( _
            System.Reflection.Assembly.GetExecutingAssembly().Location)
        End Function
        Public Shared Function mypath12() As String
            Dim path As String = _
           System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
            'URIを通常のパス形式に変換する
            Dim u As New Uri(path)
            path = u.LocalPath + Uri.UnescapeDataString(u.Fragment)
            Return System.IO.Path.GetDirectoryName(path)
        End Function
    End Class
    
    '呼び出し側
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Console.WriteLine(ClassLibrary1.Class1.mypath1)
            Console.WriteLine(ClassLibrary1.Class1.mypath2)
            Console.WriteLine(ClassLibrary1.Class1.mypath3)
            Console.WriteLine(ClassLibrary1.Class1.mypath4)
            Console.WriteLine(ClassLibrary1.Class1.mypath5)
            Console.WriteLine(ClassLibrary1.Class1.mypath6)
            Console.WriteLine(ClassLibrary1.Class1.mypath7)
            Console.WriteLine(ClassLibrary1.Class1.mypath8)
            Console.WriteLine(ClassLibrary1.Class1.mypath9)
            Console.WriteLine(ClassLibrary1.Class1.mypath10)
            Console.WriteLine(ClassLibrary1.Class1.mypath11)
            Console.WriteLine(ClassLibrary1.Class1.mypath12)
    
            '*******************実行結果*************************
    
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug\ClassLibrary1.dll
            'file:///C:/Users/ユーザー名/AppData/Local/Temporary Projects/WindowsApplication1/bin/x86/Debug/ClassLibrary1.DLL
            'file:///C:/Users/ユーザー名/AppData/Local/Temporary%20Projects/WindowsApplication1/bin/x86/Debug/ClassLibrary1.DLL
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug\WindowsApplication1.exe
            'file:///C:/Users/ユーザー名/AppData/Local/Temporary Projects/WindowsApplication1/bin/x86/Debug/WindowsApplication1.EXE
            'file:///C:/Users/ユーザー名/AppData/Local/Temporary%20Projects/WindowsApplication1/bin/x86/Debug/WindowsApplication1.EXE
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug\WindowsApplication1.EXE
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug\
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug
            'C:\Users\ユーザー名\AppData\Local\Temporary Projects\WindowsApplication1\bin\x86\Debug
    
        End Sub
    End Class
    
    
    

引用返信 削除キー/
■33466 / inTopicNo.4)  Re[3]: dllのパス
□投稿者/ Hongliang 大御所(522回)-(2016/08/25(Thu) 20:44:44)
  • アイコンそれは、実際にbin\x86\debugのdllがロードされているのではないでしょうか。
    [出力]ウィンドウにロードされたアセンブリの情報が表示されるかと思いますが、ClassLibrary1.dllはどうなっていますか?

    参照設定で参照するDLLを実行ファイルのあるフォルダ以下以外からロードするのはなかなか面倒ですが…。
引用返信 削除キー/
■33467 / inTopicNo.5)  Re[4]: dllのパス
□投稿者/ 又三郎 一般人(3回)-(2016/08/25(Thu) 21:01:24)
  • アイコンNo33466に返信(Hongliangさんの記事)
    > それは、実際にbin\x86\debugのdllがロードされているのではないでしょうか。
    > [出力]ウィンドウにロードされたアセンブリの情報が表示されるかと思いますが、ClassLibrary1.dllはどうなっていますか?
    >

    すみません。ちょっと意味がわかりませんでした。
    ClassLibrary1をビルドした時の結果は以下のようでした。

    ------ ビルド開始: プロジェクト: ClassLibrary1, 構成: Release Any CPU ------
    C:\Windows\Microsoft.NET\Framework\v3.5\Vbc.exe /noconfig /imports:Microsoft.VisualBasic,System,System.Collections,System.Collections.Generic,System.Data,System.Diagnostics,System.Linq,System.Xml.Linq /optioncompare:Binary /optionexplicit+ /optionstrict:custom /nowarn:42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 /optioninfer+ /rootnamespace:ClassLibrary1 /doc:obj\Release\ClassLibrary1.xml /define:"CONFIG=\"Release\",TRACE=-1,_MyType=\"Windows\",PLATFORM=\"AnyCPU\"" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll","C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll",C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll,C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll,C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll,C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll,C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug:pdbonly /filealign:512 /optimize+ /out:obj\Release\ClassLibrary1.dll /resource:obj\Release\ClassLibrary1.Resources.resources /target:library Class1.vb Form1.Designer.vb Form1.vb "My Project\AssemblyInfo.vb" "My Project\Application.Designer.vb" "My Project\Resources.Designer.vb" "My Project\Settings.Designer.vb"
    ClassLibrary1 -> C:\test\ClassLibrary1\ClassLibrary1\bin\Release\ClassLibrary1.dll
    ========== ビルド: 1 正常終了または最新の状態、0 失敗、0 スキップ ==========

    参照しているdllが実際に存在するパスを取得したいだけなのですが、
    難しいことなのでしょうか?
引用返信 削除キー/
■33468 / inTopicNo.6)  Re[5]: dllのパス
□投稿者/ YuO 一般人(3回)-(2016/08/25(Thu) 21:29:01)
  • アイコンNo33467に返信(又三郎さんの記事)
    > ■No33466に返信(Hongliangさんの記事)
    >>[出力]ウィンドウにロードされたアセンブリの情報が表示されるかと思いますが、ClassLibrary1.dllはどうなっていますか?
    > すみません。ちょっと意味がわかりませんでした。
    > ClassLibrary1をビルドした時の結果は以下のようでした。
    [出力]ペインの出力元として,[ビルド]ではなく[デバッグ]の方を知りたいのだと思いますよ。


    > 参照しているdllが実際に存在するパスを取得したいだけなのですが、
    > 難しいことなのでしょうか?
    根本的な所で勘違いされていないでしょうか。
    GAC (Global Assembly Cache) に登録されているアセンブリを除くと,
    参照設定されているアセンブリは原則的に実行ファイルと同じディレクトリにコピーされて使われます。
    # 正確にはビルド時にコピーされます。
    なので,参照しているDLLがどこにあろうと,実行時には実行ファイルと同じディレクトリに存在します。
    そして,DLLが元々どこに存在していたか,というのはわかりません。
    ファイルをコピーしたときにコピー元は辿れませんから。
引用返信 削除キー/
■33469 / inTopicNo.7)  Re[6]: dllのパス
□投稿者/ 又三郎 一般人(4回)-(2016/08/25(Thu) 22:32:47)
  • アイコンそういうことですか。理解しました。
    どうもありがとうございました。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -