7

ほとんどすべての新しいプロジェクトでインポートするために使用する一連のクラスを含む標準の「クラス ライブラリ」プロジェクトがあります。

私の作業方法は、私のメイン プロジェクトである空のプロジェクトで新しいソリューションを作成することです。次に、前述のクラス ライブラリ プロジェクトをソリューションに追加します。このようにして、ソリューション エクスプローラーで両方のプロジェクトを表示し、ライブラリ コードを表示することもできます。または必要に応じて更新します。次に、メイン プロジェクトにコードを記述し、コンパイルします。

これにより、コンパイル時に2つのファイルが作成されました:ファイル*.exestdlib.dll

簡単でクリーンな理由で再配布したい非常に小さなツールにライブラリを使用する場合があるためstdlib.dll、クラスライブラリプロジェクトから生成されたものを*.exeファイルに埋め込みたいと思います。

Microsoft Visual Basic 2010 Express でこれを行う理由があるに違いないと確信していますが、その方法はわかりません。

なにか提案を?

4

2 に答える 2

15

これは、アセンブリを埋め込むためのAlexの手順のより「ステップバイステップ」バージョンです。

  1. 目的のアセンブリ(stdlib.dll)をプロジェクトのリソースに追加します。プロジェクトプロパティの[リソース
    ]タブに 移動し、 [リソースの追加]>[既存のファイルの追加... ]を選択します。
  2. [アプリケーション]タブに切り替えて、 [アプリケーションイベントの表示]ボタンをクリックします。
  3. このコードを、開いたApplicationEvents.vbコードに追加します。

    Private Sub AppStart(ByVal sender As Object, 
      ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ResolveAssemblies
    End Sub
    
    Private Function ResolveAssemblies(sender As Object, e As System.ResolveEventArgs) As Reflection.Assembly
        Dim desiredAssembly = New Reflection.AssemblyName(e.Name)
    
        If desiredAssembly.Name = "the name of your assembly" Then
            Return Reflection.Assembly.Load(My.Resources.STDLIB) 'replace with your assembly's resource name
        Else
            Return Nothing
        End If
    End Function 
    
  4. 次に、プロジェクトをコンパイルすると、依存アセンブリが単一のファイルとして出力に組み込まれます。

出力フォルダーに依存アセンブリがある場合があることに注意してください。これは、VSがすべての依存アセンブリを出力パスにコピーするように事前構成されているためです。これをオーバーライドするには、プロジェクトのプロパティの[参照]タブに移動し、依存アセンブリの[ローカルコピー]プロパティをFalseに設定します。これにより、アセンブリが出力ディレクトリにコピーされなくなります。

于 2012-04-20T20:39:34.307 に答える
2

Assembly[既存のファイルを追加] を選択し、[ビルド オプション] を [埋め込みリソース] に変更することで、(この場合は .dll) をプロジェクトに埋め込むことができます。

次に、コード内のライブラリに最初にアクセスするとすぐに発生Handlerするイベントの を追加します。AppDomain.CurrentDomain.AssemblyResolve

そのハンドラー コードは次のようになります。

   AddHandler AppDomain.CurrentDomain.AssemblyResolve,
            Function(sender As Object, args As System.ResolveEventArgs) As System.Reflection.Assembly
                Dim ressourceName = "YourNamespace.YourSubNamespace." + New AssemblyName(args.Name).Name + ".dll"
                Using stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ressourceName)
                    Dim assemblyData(CInt(stream.Length)) As Byte
                    stream.Read(assemblyData, 0, assemblyData.Length)
                    Return Assembly.Load(assemblyData)
                End Using
            End Function

その後、追加のファイルなしでツールをデプロイできます。

于 2012-04-05T08:52:41.247 に答える