2

私は別のクラスを追加したクラスライブラリを持っていますが、何を試しても、ライブラリを参照しているプロジェクトでは使用できません。このライブラリで作成したオリジナルのクラスを参照して使用することに問題はありません。

私は以下のすべてを試しました:

  1. プロジェクト ソリューションのクリーニング
  2. デバッグとリリースの両方を保存して再構築する
  3. プロジェクトを閉じて再度開く
  4. 参考にしたいライブラリ プロジェクトの手順 1 ~ 3

ライブラリを参照したいプロジェクトで、.dll フォームを bin/release フォールドからロードしようとしました。メイン ライブラリ プロジェクト .dll を obj/release フォルダにロードしようとしました。ライブラリに追加した新しいクラスにまだアクセスできないため、ニーターは違いを生みました。ビンに折りたたまれたリリースから DotNetOpenAuth_Library.dll を参照しています。

これが違いを生む場合、私は先週ダウンロードした VS 2012 Express for Web を使用しています。

ライブラリに追加したビルド エラーのないクラスは次のとおりです。

namespace DotNetOpenAuth_Library
{
    class EmbeddedResourceUrlService : IEmbeddedResourceRetrieval
    {
        private static string pathFormat = "{0}/Resource/GetWebResourceUrl?    assemblyName=    {1}&typeName={2}&resourceName={3}";
        //private static string pathFormat = "{0}/Resource/GetWebResourceUrl";

        public Uri GetWebResourceUrl(Type someTypeInResourceAssembly, string     manifestResourceName)
    {
        if (manifestResourceName.Contains("http"))
        {
            return new Uri(manifestResourceName);
        }
        else
        {
            var assembly = someTypeInResourceAssembly.Assembly;

            // HACK
            string completeUrl = HttpContext.Current.Request.Url.ToString();
            string host = completeUrl.Substring(0,
                completeUrl.IndexOf(HttpContext.Current.Request.Url.AbsolutePath));

            var path = string.Format(pathFormat,
                        host,
                        HttpUtility.UrlEncode(assembly.FullName),
                        HttpUtility.UrlEncode(someTypeInResourceAssembly.ToString()),
                        HttpUtility.UrlEncode(manifestResourceName));

            return new Uri(path);
        }
    }
}

}

4

3 に答える 3

4

public をクラス定義の前に置きます。クラスが internal 1とマークされている場合、同じアセンブリ内の他のクラスからのみアクセスできます2

namespace DotNetOpenAuth_Library
{
    public class EmbeddedResourceUrlService : IEmbeddedResourceRetrieval
    {
        //(snip)
    }
}

これは、アクセス修飾子を説明するMSDN リンクです。

1: クラスの前に修飾子を置かない場合、デフォルトで internal になります。2: 他のアセンブリをフレンド アセンブリ
としてマークしない限り

于 2013-01-19T05:22:56.637 に答える
0

問題はアクセス修飾子の欠如にあるように私には思えます。デフォルトでは、C# コンパイラはクラスを内部として扱います。宣言を次のように変更すると機能するはずです

public class EmbeddedResourceUrlService : IEmbeddedResourceRetrieval
于 2013-01-19T05:23:40.207 に答える
0

クラスEmbeddedResourceUrlServiceはプライベートです。パブリック修飾子を使用してください

namespace DotNetOpenAuth_Library
{
    // make class public
    public class EmbeddedResourceUrlService : IEmbeddedResourceRetrieval
    {
        private static string pathFormat = "{0}/Resource/GetWebResourceUrl?    assemblyName=    {1}&typeName={2}&resourceName={3}";
        //private static string pathFormat = "{0}/Resource/GetWebResourceUrl";

        public Uri GetWebResourceUrl(Type someTypeInResourceAssembly, string     manifestResourceName)
    {
        if (manifestResourceName.Contains("http"))
        {
            return new Uri(manifestResourceName);
        }
        else
        {
            var assembly = someTypeInResourceAssembly.Assembly;

            // HACK
            string completeUrl = HttpContext.Current.Request.Url.ToString();
            string host = completeUrl.Substring(0,
                completeUrl.IndexOf(HttpContext.Current.Request.Url.AbsolutePath));

            var path = string.Format(pathFormat,
                        host,
                        HttpUtility.UrlEncode(assembly.FullName),
                        HttpUtility.UrlEncode(someTypeInResourceAssembly.ToString()),
                        HttpUtility.UrlEncode(manifestResourceName));

            return new Uri(path);
        }
    }
}

}

その後、クラスが表示されない場合でも(数回発生しました)

  1. きれいな解決
  2. 両方のプロジェクトからすべての bin フォルダーを削除します
  3. すべて再構築

そしてエラーはありません

于 2013-01-19T05:24:44.090 に答える