【.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 ディレクトリより読まれますので注意して下さい。




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[PROc]
claudebot
24/03/30 00:11:55
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube