12

Visual Studio 2010 で最初の「サービス参照」をクライアント プロジェクトに追加するときに、この奇妙な名前空間の問題が発生しました。

プロジェクトのデフォルトの名前空間が 2 つ以上の部分を使用している場合、たとえば、サービス参照を追加すると、完全修飾名を持つ多くの自動生成コードを持つMyCompany.MyApp名前空間を含む Reference.cs ファイルが作成されます。MyCompany.MyApp.ServiceReferenceNameSystem.SerializableAttributeSystem.Runtime.Serialization.DataContractAttribute

コンパイラが System 名前空間を名前空間のサブメンバーとして扱い始めるため、Reference.cs ファイルはコンパイル エラーでいっぱいになりMyCompany.MyAppます。次の行に沿って非常に多くのエラーが発生します。

The type or namespace name 'Runtime' does not exist in the namespace 'MyCompany.MyApp.System'...

たとえば、Reference.cs ファイルの先頭にある名前空間を単純なものに修正するMyCompanyMyApp.ServiceRefernceNameと、コンパイラは動作し、System 名前空間の参照を .net の System 名前空間の宣言として認識します。

マルチパートの名前空間を本当に維持したいので、今のところ別の回避策を使用しています。私の現在の代替手段はglobal::、システム名前空間参照の前に追加して、コンパイラに正しいことを強制することです。実際、「サービス参照の追加」ウィザードが T4 テンプレートを使用している場合は、それらを修正して、回避策をソースに埋め込むことができます。

質問

ここで何が起こっているのか、マルチパート名前空間がこの問題を引き起こす理由を理解したいと思います。おそらく、名前空間には私が思っていたよりも多くのものがあります。次に、サービス参照を追加するたびにグローバル検索/置換を実行したり、T4 テンプレートをいじったりするよりも優れたソリューションを見つけたいと思っています。

4

8 に答える 8

27

ここで答えがやや不明確であることがわかったので、これを例として追加すると思いました(コメントでそれを行いますが、ここでは見栄えが良くなります):

したがって、これをデフォルトの名前空間として使用します。

namespace RelatedData.Loader

ただし、次の名前のクラスも追加します。

 public class RelatedData
{
}

クラス名は、サービス参照の追加を使用してプロキシを生成するときに名前空間の一部と一致するため、混乱します。

ここでの答えは、クラスの名前を変更することでした。

 public class RelatedDataItem
于 2012-12-12T22:26:47.637 に答える
18

ああ、やっと原因がわかりました。

私は非常に大規模なサード パーティの WCF API に対して作業を行っています...名前空間の 1 つがLameCompany.System(!!) その後、大虐殺が発生します...

Arrrgghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh...

ここで学ぶべき教訓は、Visual Studio/.net コンパイラがSystem、プロジェクト内にSystem. それを見つけて削除し、それを作成した開発者を撃ちます。

于 2011-05-20T08:35:27.973 に答える
8

名前空間に似たクラス名を持つと、これが発生することがわかりました。

クラス名を変更してみてください

于 2016-10-25T05:48:37.980 に答える
1

サービスへの参照を更新した後、WCF サービスへの参照を持つクライアント プロジェクトに小さな変更を加えた後、jabu.hlong と Simon Needham によって記述された VS2012 で同様の問題に遭遇しました。生成された Reference.cs ファイルなど (生成された XAML のファイル) をコンパイルするときに、多くのエラーが発生しました。

ソリューションで特定のアセンブリの型を再利用することを選択しましたが、名前空間で同様の問題が発生しました。

私が得るエラーは、再利用されたアセンブリの名前空間と生成された型の名前空間が Reference.cs で使用されたときに見つからないということです。両方の名前空間は、同じソリューションからのものであるため、最初の部分が共通しています。ソリューション内の私の名前空間はappname.tier.technology.project. 競合する名前空間は両方ともAppname.Dto.Modulename(再利用されたアセンブリ) とAppname.Client.Wpf.ServiceName(生成された型のサービスを使用するクライアント プロジェクトの名前空間) です。

この問題は、名前空間に新しいユーティリティ クラスを作成したときに、クライアント プロジェクトに小さな変更を加えた後に発生しますAppname.Client.Wpf.Appname。この名前空間を選択したのは、Appname がクライアント プロジェクト内のモジュールの名前でもあるためです。これはコンパイラを混乱させるようで、生成された Reference.cs で両方の名前空間を解決できません。ユーティリティ クラスの名前空間を変更して 2 つの同一部分を使用しないようにし、サービス参照を更新すると、Reference.cs のコンパイラ エラーが消えます。

于 2017-09-14T08:42:12.207 に答える