7

実稼働コードと同様の構造で、テストプロジェクトのエラーの1つを再現することができました。これは、3つの単純なプロジェクトで構成されています。

共通(クラスライブラリ):

namespace Common
{
    public enum PrimaryColor
    {
        Red,
        Green,
        Blue
    };
}

Commonへの参照があるライブラリ(WCFサービスライブラリ):

using Common;

namespace Library
{
    [ServiceContract]
    public interface ILibrary
    {
        [OperationContract]
        PrimaryColor GetColor();
    }

    public class Library : ILibrary
    {
        public PrimaryColor GetColor()
        {
            return PrimaryColor.Red;
        }
    }
}

Commonへの参照と「LibraryServiceReference」と呼ばれるライブラリへのサービス参照を持つClientApp(コンソールアプリケーション):

using Common;
using ClientApp.LibraryServiceReference;

namespace ClientApp
{
    class Program
    {
        static void Main(string[] args)
        {
            LibraryClient client = new LibraryClient("WSHttpBinding_ILibrary");
            PrimaryColor color = client.GetColor();
        }
    }
}

ClientAppおよびLibraryのapp.configファイルは自動生成され、変更していません。また、ClientAppのLibraryServiceReferenceのデフォルト構成を変更していません。

このソリューションをコンパイルすると、ClientAppプロジェクトで次のエラーが発生します。

エラー1

'PrimaryColor' is an ambiguous reference between 'Common.PrimaryColor' and 'ClientApp.LibraryServiceReference.PrimaryColor'

エラー2

Cannot implicitly convert type 'ClientApp.LibraryServiceReference.PrimaryColor' to 'Common.PrimaryColor'. An explicit conversion exists (are you missing a cast?)

これを修正するのを手伝ってください。

4

10 に答える 10

4

[サービス参照の追加]または[サービス参照の構成] の [詳細オプション] で[参照されているすべてのアセンブリで型を再利用する]が選択されていることを確認します。

ここに画像の説明を入力

于 2012-06-18T13:37:00.660 に答える
3

「AnyCpu」ではなくx64を構築しているためです。私は今これに出くわしており、それがバグなのか、それとも予期された動作なのかを把握しようとしています.

于 2016-06-23T19:04:40.427 に答える
1
  1. 次のように列挙型を飾ります。

    namespace Common
    {
        [DataContract]
        public enum PrimaryColor
        {
            [EnumMember]
            Red,
            [EnumMember]
            Green,
            [EnumMember]
            Blue
        };
    }
    
  2. サービス参照を更新します(マークが述べたように再利用タイプを確認してください)。

  3. クライアント コードを再構築します。

于 2012-06-18T14:25:05.143 に答える
1

この問題は、無害で予測不可能な方法で何度も発生しました。前回、どのように「修正」したかを共有したいと思いました。

Visual Studio 2013 を使用していますが、rev で問題が発生しました。

あいまいな参照は、それ自体で発生するようです。私はそれを引き起こすために何もしませんでした。最新の例では、いくつかのコード ビハインドをデバッグしていたところ、突然 7 個、次に 22 個、次に 49 個のエラーが発生しました。これらはすべて同じ性質のものです。

サービス参照を完全に削除し、再度追加しました。再利用タイプを変更するだけでは何も起こりませんでした。私のソリューションには、WCF サービス、クラス ライブラリ、UI、およびコントロール ライブラリがあります。また、クラス ライブラリの一部のコード ビハインドでの使用も削除しました。

これは非常に厄介な問題であり、ありがたいことに数週間ごとにしか発生しません。なぜこれが機能したのですか?私の給料等級を超えています。あなたの痛みが分かります!お役に立てれば。この場合、xaml ページでコード ビハインドを開いたときに、エラーが再び発生しました。

ここに画像の説明を入力

于 2016-08-09T14:47:33.287 に答える
0

クライアント コードとサーバー コードの両方を制御しているようです。なぜサービス リファレンスを作成したいのですか。特定の理由があるのでしょうか、それとも単に簡単だと思われるのでしょうか。

クライアント サーバー アプリケーションの両側を制御するプロジェクトでは、"コントラクト アセンブリ" (おそらく共通のアセンブリ) を作成する方が適切です。これには、コントラクトに関係するインターフェイスとオブジェクトが含まれており、クライアントとサーバーの両方から参照する必要があります。サービスと通信するために、クライアントは を使用してプロキシ クラスを作成しChannelFactoryます。専用の WCF クライアントは必要ありません。

例:

ChannelFactory<ISampleService> factory = new ChannelFactory<ISampleService>("Binding_from_config");

ISampleService sampleService = factory.CreateChannel();

sampleService.SomeCall();

factory.Close();

ファクトリ パターンは、IoC 経由でプロキシを挿入するための理想的な候補にもなります。

サービス参照を作成するよりも、共通アセンブリを参照する利点は次のとおりです。

  • 自動生成されたクラスは必要ないため、あいまいな参照はありません。
  • 契約を変更するたびにサービス参照を更新する必要はありません。
于 2012-06-18T14:33:07.717 に答える
0

サービス参照を右クリックし、「すべての参照アセンブリで型を再利用する」から「指定された参照アセンブリで型を再利用する」に変更し、特定の共通アセンブリをチェックすることで、これを修正できました。

于 2019-09-11T15:03:08.250 に答える
-1

ここでの問題は、PrimaryColor が Common と ClientApp.LibraryServiceReference の両方に存在し、クラスで両方の名前空間を参照していることです。

この問題を解決するには、必要なインスタンスを明示的に参照します。

Common.PrimaryColor color = ....

またはエイリアスを設定します。

using Service = ClientLibraryServiceReference; ...

Service.PrimaryColor color = ......

于 2012-06-18T13:36:46.150 に答える
-2

サービス参照を作成するときに、「生成されたサービス コントラクトに共通の型を含める」のようなオプションはありませんか?

あなたのサービス参照ではクラスが「コピー」されていると思います。そのため、このエラーが発生します。生成されたサービス ファイルを検査し、削除してから [サービス参照の追加] で再度追加し、そこにあるオプションを確認します。

編集

Type PrimaryColor が 2 回定義されていることはほぼ確実ですが。共通プロジェクトで 1 回、サービス参照で 1 回、clientApp でこれを試すこともできます (PrimaryColor タイプをより明示的に指定するため)。

Common.PrimaryColor color = client.GetColor();
于 2012-06-18T13:36:45.697 に答える