【.NET】 プライベートクラスライブラリとその配置方法

  レジストリチューニング



  
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog を DWORD で 1 にする
事によって、エラー時の情報の詳細を取得する
  

↓出力例
  
=== 事前バインド状態情報 ===
ログ: ユーザー = NIGHT\Administrator
ログ: DisplayName = Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=4917fcd39bf39de9
 (Fully-specified)
ログ: Appbase = file:///C:/user/web/vbclass/refTest/vb_build/
ログ: Initial PrivatePath = NULL
呼び出しているアセンブリ: Module1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
===
ログ: このバインドは default の読み込みコンテキストで開始します。
ログ: 構成ファイルにプライベート パスのヒントが見つかりました: aaa
ログ: アプリケーション構成ファイル C:\user\web\vbclass\refTest\vb_build\Module1.exe.config を使用します。
ログ: C:\WINNT\Microsoft.NET\Framework\v2.0.50727\config\machine.config からのコンピュータ構成ファイルを使用します。
ログ: ポリシー後の参照: Class1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=4917fcd39bf39de9
ログ: 新しい URL file:///C:/user/web/vbclass/refTest/vb_build_dll/Class.dll をダウンロードしようとしています。
  



  Visual Studio が作成する AssemblyInfo.vb の例



  
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices

' アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 
' アセンブリに関連付けられている情報を変更するには、
' これらの属性値を変更してください。

' アセンブリ属性の値を確認します。

<Assembly: AssemblyTitle("ConsoleApplication1")> 
<Assembly: AssemblyDescription("")> 
<Assembly: AssemblyCompany("lightbox")> 
<Assembly: AssemblyProduct("ConsoleApplication1")> 
<Assembly: AssemblyCopyright("Copyright (C) lightbox 2007")> 
<Assembly: AssemblyTrademark("")> 

<Assembly: ComVisible(False)>

'このプロジェクトが COM に公開される場合、次の GUID がタイプ ライブラリの ID になります。
<Assembly: Guid("2313de5b-d930-4a02-96e2-20bf7df94222")> 

' アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を 
' 既定値にすることができます:
' <Assembly: AssemblyVersion("1.0.*")> 

<Assembly: AssemblyVersion("1.0.0.0")> 
<Assembly: AssemblyFileVersion("1.0.0.0")> 
  



  厳密な名前の無いクラスライブラリ ( プライベート )

myClass.vb
  
Imports System.Reflection

<Assembly: AssemblyVersion("1.0.0.0")> 

Namespace Lightbox

	Public Class Tool

		' ********************************************************
		' (トークン配列化関数)
		' ********************************************************
		Public Function GetArray(ByVal str As String, ByVal d As String) As String()

			' 区切り文字定義
			Dim delimStr As String = d
			Dim delimiter As Char() = delimStr.ToCharArray()
			' 分解
			Dim aRet As String() = str.Split(delimiter)

			Return aRet

		End Function

		' ********************************************************
		' (プログラムが実行されているディレクトリを取得)
		' ********************************************************
		Public Function GetProgramDir() As String

			Dim ab As Reflection.Assembly = Reflection.Assembly.GetEntryAssembly ()
			Dim mds As Reflection.Module() = ab.GetModules()
			Dim md As Reflection.Module = mds(0)

			' ************************************************
			' ディレクトリ部分を取得
			' ( System.IO.Path.GetDirectoryName が簡単 )
			' ************************************************
			Dim aDataDir As String() = GetArray(md.FullyQualifiedName, "\")
			Dim pgDir As String = String.Join("\", aDataDir, 0, aDataDir.Length - 1)

			Return pgDir

		End Function

	End Class

End Namespace
  

↓ビルド
  
vbc.exe /target:library /out:lbox.dll myClass.vb
  

↓厳密な名前の確認
  
vb.net>sn -T lbox.dll

Microsoft(R) .NET Framework Strong Name Utility  バージョン 2.0.50727.42
Copyright (c) Microsoft Corporation.  All rights reserved.

lbox.dll は厳密な名前のアセンブリではありません。
  



  呼び出しコードとクラスライブラリのデフォルトの配置場所

myModule.vb
  
Imports Lightbox

Module Module1

    Sub Main()

        Dim lb As Tool = New Tool

        Console.WriteLine(lb.GetProgramDir())

    End Sub

End Module
  

↓ビルド( lbox.dll は、おなじディレクトリにあります )
  
vbc.exe /reference:./lbox.dll myModule.vb
  

上記ビルドで作成された、myModule.exe を、lbox.dll を削除した状態で実行すると
以下のようになります。

  
=== 事前バインド状態情報 ===
ログ: ユーザー = NIGHT\Administrator
ログ: DisplayName = lbox, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
ログ: Appbase = file:///C:/user/web/vbclass/ClassLIB/
ログ: Initial PrivatePath = NULL
呼び出しているアセンブリ: myModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
===
ログ: このバインドは default の読み込みコンテキストで開始します。
ログ: アプリケーション構成ファイルは見つかりませんでした。
ログ: C:\WINNT\Microsoft.NET\Framework\v2.0.50727\config\machine.config からのコンピュータ構成ファイルを使用します。
ログ: 現時点でポリシーは参照に適用されません (プライベート、カスタム、部分的、または場所ベースのアセンブリ バインド)。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox/lbox.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox.EXE をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox/lbox.EXE をダウンロードしようとしています。
  

これより、デフォルトの lbox.dll のデフォルトの配置位置は、myModule と同じディレクトリか
または、lbox\lbox.DLL である事が解ります



  任意の下位ディレクトリへの配置

myModule.exe.config ファイルの作成
  
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="myClass"/>
      </assemblyBinding>
   </runtime>
</configuration>
  

myClass に lbox.dll が存在しない場合は、以下のようなメッセージが出力されます

  
=== 事前バインド状態情報 ===
ログ: ユーザー = NIGHT\Administrator
ログ: DisplayName = lbox, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
ログ: Appbase = file:///C:/user/web/vbclass/ClassLIB/
ログ: Initial PrivatePath = NULL
呼び出しているアセンブリ: myModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
===
ログ: このバインドは default の読み込みコンテキストで開始します。
ログ: 構成ファイルにプライベート パスのヒントが見つかりました: myClass
ログ: アプリケーション構成ファイル C:\user\web\vbclass\ClassLIB\myModule.exe.config を使用します。
ログ: C:\WINNT\Microsoft.NET\Framework\v2.0.50727\config\machine.config からのコンピュータ構成ファイルを使用します。
ログ: 現時点でポリシーは参照に適用されません (プライベート、カスタム、部分的、または場所ベースのアセンブリ バインド)。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox/lbox.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/myClass/lbox.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/myClass/lbox/lbox.DLL をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox.EXE をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/lbox/lbox.EXE をダウンロードしようとしています。
ログ: 新しい URL file:///C:/user/web/vbclass/ClassLIB/myClass/lbox.EXE をダウンロードしようとしています。
  



  任意のディレクトリへの配置

厳密な名前がクラスライブラリに必要になるので、それに必要なキーファイルを作成します

C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin にある sn.exe
  
sn -k <file name> 
  
( 例 sn -k bonurd )

  
Imports System.Reflection

<Assembly: AssemblyKeyFile("bonurd.snk")>
<Assembly: AssemblyVersion("1.0.0.0")> 

Namespace Lightbox

	Public Class Tool

		' ********************************************************
		' (トークン配列化関数)
		' ********************************************************
		Public Function GetArray(ByVal str As String, ByVal d As String) As String()

			' 区切り文字定義
			Dim delimStr As String = d
			Dim delimiter As Char() = delimStr.ToCharArray()
			' 分解
			Dim aRet As String() = str.Split(delimiter)

			Return aRet

		End Function

		' ********************************************************
		' (プログラムが実行されているディレクトリを取得)
		' ********************************************************
		Public Function GetProgramDir() As String

			Dim ab As Reflection.Assembly = Reflection.Assembly.GetEntryAssembly ()
			Dim mds As Reflection.Module() = ab.GetModules()
			Dim md As Reflection.Module = mds(0)

			' ************************************************
			' ディレクトリ部分を取得
			' ( System.IO.Path.GetDirectoryName が簡単 )
			' ************************************************
			Dim aDataDir As String() = GetArray(md.FullyQualifiedName, "\")
			Dim pgDir As String = String.Join("\", aDataDir, 0, aDataDir.Length - 1)

			Return pgDir

		End Function

	End Class

End Namespace
  

公開キートークンを取得

  
vb.net>sn -T lbox.dll

Microsoft(R) .NET Framework Strong Name Utility  バージョン 2.0.50727.42
Copyright (c) Microsoft Corporation.  All rights reserved.

公開キー トークン 2138cc86b120e333

  

myModule.exe.config を以下のように変更
( lbox.dll に関しては、myClass ディレクトリからは読まれなくなる )

  
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="myClass"/>
         <dependentAssembly>
            <assemblyIdentity name="lbox"  culture="neutral" publicKeyToken="2138cc86b120e333"/>
            <codeBase version="1.0.0.0" href="C:\temp\lbox.dll"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>
  



  ASP.NET への配置

常に、仮想ディレクトリのルートである bin ディレクトリより読まれますので注意して下さい。










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ