0

使用する前に静的メソッドを呼び出す必要があるサードパーティのライブラリを使用しています。ソフトウェアのライセンスを検証するためにシリアル キーを設定します。このライブラリを複数のプロジェクトで使用する必要があり、それらのプロジェクトがこのライセンスについて心配する必要がないようにしたいと考えています。理想的には、ライセンスを処理し、ライブラリを使用するプロジェクトによってそれを参照する共有アセンブリを作成し、それらのプロジェクトを、ライセンスが行われていることさえ知らないようにしたいと考えています。

これを達成することを考え始める 1 つの方法は、おそらくアセンブリ属性を使用することです。したがって、ライセンスを設定するコンストラクターを持つものを作成します。

[AttributeUsage(AttributeTargets.Assembly)]
public class LibraryLicenseAttribute : Attribute
{
  public LibraryLicenseAttribute()
  {
    Lib.SetLicense("valid key");
  }
}

それをラッパー プロジェクトに配置します。

LibraryWrapperProject
  Properties
    AssemblyInfo.cs
  References
    Lib.dll
  LibraryLicenseAttribute.cs

そして、それを AssemblyInfo.cs に含めて呼び出します。

[LibraryLicense]

これで、ライブラリを使用する別のプロジェクトでこのプロジェクトを参照できます。

LibraryUserProject
  References
    LibraryWrapperProject
  LibraryUser.cs

…が、図書館を利用しに行くと…

class LibraryUser
{
  public LibraryUser()
  {
    Lib.Use();
  }
}

ライセンスが設定されていないことが報告されます。呼び出し元プロジェクトの AssemblyInfo.cs に属性を含めると、属性が呼び出されることがわかりました。これは、すべてのダウンストリーム プロジェクトにライセンスを再配布するよりは優れていますが、それを機能させるにはまだ余分な作業が必要です。

さらに、一部のプロジェクトは、elseware で動的にロードされます。例えば:

Assembly.Load("LibraryUserProject.dll");

含まれているアセンブリを動的にロードするときに、ライセンス アセンブリ属性を呼び出すにはどうすればよいですか? これを容易にする別の .NET Framework 機能はありますか?

4

1 に答える 1

0

問題の解決策をあまり分析せずに、アセンブリが解決またはロードされたときにコードを実行するためのAppDomain.CurrentDomain.AssemblyLoadおよびイベントを確認することをお勧めします。AppDomain.AssemblyResolve

別のより洗練された解決策は、静的型初期化子 (静的コンストラクター) またはModule Initializersを使用することです。静的型初期化子は、型が初めて参照されたときに呼び出され、実装が簡単です。ただし、C# のモジュール初期化子は 簡単な作業ではありませんが、実装することで目標を達成できます。

于 2010-09-23T03:52:36.947 に答える