10

所以今天我在尝试构建我们公司的解决方案时遇到了一个有趣的问题,我想问你们你们知道为什么会发生这种情况。我被告知它可能来自我的机器/视觉工作室,因为其他人没有同样的问题。

所以我们在项目中有一个方法A

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer)
{
   string queueName = typeNameSerializer.Serialize(messageType);

   return messageType.GetAttribute<GlobalRPCRequest>() != null || AvailabilityZone == null
        ? queueName
        : queueName + "_" + AvailabilityZone;
}

其中GetAttribute<GlobalRPCRequest>()定义在public static class ReflectionHelpers

 public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute;

然后我们有B一个有方法的项目:

public static string GetAttribute(this XElement node, string name)
{
   var xa = node.Attribute(name);
   return xa != null ? xa.Value : "";
}

我必须指出,我们在 project 中引用了Bproject A。现在发生的情况是,当我尝试构建时出现编译错误:

错误 966 类型“System.Xml.Linq.XElement”在未引用的程序集中定义。您必须添加对程序集“System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。D:\Repositories\website\website\submodules\core\src\A\Extensions\Extensions.cs 37 13 A

发生的事情是编译器认为我实际上是在使用GetAttribute项目中的方法B(在我看来!)。为什么会这样?因为当我尝试导航到GetAttributeVS 时,我找到了正确的方法(在 中的那个ReflectionHelpers)。难道是因为反射?注意:我通过静态调用该方法或在我的项目中添加对 System.Xml.Linq 的引用来解决此问题A,但我对 VS/语法检查功能的奇怪行为感到好奇。

4

3 回答 3

1

这是一个猜测,但我认为你的功能:

private static string RpcRoutingKeyNamingConvention(Type messageType, ITypeNameSerializer typeNameSerializer)与您的辅助方法签名不匹配,因为您尝试返回一个字符串:

public static TAttribute GetAttribute<TAttribute>(this Type type) where TAttribute : Attribute;它需要一个 TAttribute 返回类型。

也许,您可以尝试修改您的函数RpcRoutingKeyNamingConvention以返回GlobalRPCRequest并检查编译器是否继续发疯。

于 2016-04-21T02:46:35.147 回答
1

Visual Studio 总是很困惑!我试图在我的 VS 2015 (.NET 4.6) 中重现该场景,它编译得很好。我不必在我的项目 A 中添加对 System.Xml.Linq 的引用。

我的猜测是这可能是一个缓存问题。你可能想试试这个:

  1. 删除对项目 B 的引用
  2. 清理然后重建两个解决方案
  3. 将引用添加回来
  4. 重建和瞧!嗯..希望

希望它有帮助,让我知道:)

于 2016-04-21T10:53:10.750 回答
0

我想这是怎么回事:
- B 引用了 System.Xml.Linq
- B 的构建没有问题。
- 您在 A 中引用 B
- A 没有对 System.Xml.Linq 的引用
- A 似乎使用了 B 中定义的函数
- 当您尝试构建项目 A 时,它会产生该错误

我对吗?

如果是这样,那是完全正常的。因为使用引用 (A) 的项目必须通过它所引用的 (B) 引用所引用的 (System.Xml.Linq)。

像这样想:当您尝试将 nuget 包添加到您的项目时,如果它有依赖项,那么 nuget 也会安装它。为什么?因为这种情况。

如果我正确理解您的答案,这是完全正常的。

于 2016-04-19T14:15:36.270 回答