3

クラス ライブラリ プロジェクトがあります。このプロジェクトでは、ロジックを分離するためのフォルダーがいくつかあります。

DALライブラリがあり、 DAL 内にIDALDALFactory、およびSQLServerDALがあるとします。
これで、DAL dll を他のプログラマーに渡すと、そのプログラマーはすべてのサブDLL を使用できるようになりました。彼に SQLServerDal 以外を使用させたくないとします。SQLServerDAL をカプセル化して、その存在を誰も認識できないようにするにはどうすればよいですか。

ありがとう。
編集:
より具体的に:

using DAL; // it can be written
using DAL.IDAL; // it can be written
using DAL.DALFactory; // it can be written
using DAL.SQLServerDAL; // it dont want to allow anyone write that
4

4 に答える 4

1

名前空間はメタデータレベルに存在しないため、これを行うことは不可能です。他の人が提案しているように、名前空間SQLServerDALのすべてのクラスを内部にするか、SQLServerDALを名前空間ではなく静的内部クラスにします。このアプローチでは、SQLServerDAL内のクラスはネストされたクラスになり、DALアセンブリの外部からはアクセスできなくなります。

// what you have now:
namespace DAL.SQLServerDal
{
    public class A {}
    public class B {}
}

// in other assembly
using DAL.SQLServerDal ; // ok
new A () ; // ok

// with internal classes:
namespace DAL.SQLServerDal
{
    internal class A {}
    internal class B {}
}

// in other assembly
using DAL.SQLServerDal ; // ok
new A () ;               // error: A is inaccessible due to protection level

// what I propose:
namespace DAL
{
    internal static class SQLServerDal
    {
        public class A {}
        public class B {}
    }
}

// in other assembly
using DAL.SQLServerDal ; // error: namespace DAL.SQLServerDal does not exist

ただし、リフレクションまたはコード生成を使用する場合、使用しているライブラリがネストされたクラスを適切にサポートしていないと、問題が発生する可能性があります。

于 2012-04-12T06:20:53.670 に答える
0

あなたが話すこれらの「サブDLL」は何ですか?

クラスライブラリプロジェクトがあります。

これから、DLLが1つあると思います。その場合、「サブDLL」のようなものはありません。プロジェクトのサブフォルダーで定義されたクラスは、その単一のDLLの一部です。それらがサブフォルダーにあるという事実は、何の違いもありません。各クラスの名前空間にサブフォルダー名を追加した場合、これはすべて、結果のタイプの名前にフォルダー内のフォルダーの名前が含まれることを意味します。

特定のタイプを内部にする場合は、internalキーワードを使用します。残念ながら、特定のサブフォルダの下にあるすべてのクラスを内部にする方法はありません。これを行う場合は、サブフォルダーのinternalクラス定義にキーワードを追加する必要があります。

于 2012-04-11T12:18:21.010 に答える
0

これが最適な解決策かどうかはわかりませんが、:-

SQLServerDAL クラスを internal に変更します。次に、プロパティ/assemblyinfo.cs ファイルで、SQLServerDAL へのアクセスを必要とするすべての DLL を追加します。

using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Fully.Qualified.AssemblyName")]

これは明らかに逆サンブルを防ぐものではありませんが、あなたの dll を消費する人に公開されることはありません。

于 2012-04-11T10:52:41.207 に答える
0

コメントで述べたように、非表示にする DLL を親プロジェクトのリソース ファイルとして追加できます。したがって、コンパイル済みの DLL を追加し、ソリューションで「埋め込みリソース」としてマークする必要があります。

2 番目のステップは、親ライブラリにアクセスするために DLL をロードすることです。

Stream stream = GetType().Assembly
               .GetManifestResourceStream("<<FULL QUALIFIED DLL NAME>>");
if (stream == null)
    throw new InvalidDataException("<<FULL QUALIFIED DLL NAME>> not found.");

byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int) stream.Length);

Assembly assembly = Assembly.Load(buffer);

アセンブリ参照を取得したら、アクセスするクラスとメソッドを取得できます。

var sqlServerDAL = assembly.GetType("<<FULL QUALIFIED CLASS NAME>>");
var method = sqlServerDAL.GetMethod("<<METHOUD>>", BindingFlags.Public);

これが一部のクラスを難読化するための非常に厄介な方法であることはわかっていますが、効果的です。DLL がディレクトリにないため、名前空間を単純に入力してクラスにアクセスすることもできません。

于 2012-04-12T06:11:13.500 に答える