4

例如,假设我正在一个名为的命名空间中工作,Org.Company并且该命名空间包含MyClass. 我还导入了一个带有命名空间的 nuget,该命名空间Company名为OtherClass.

所以,当我在我的Org.Company命名空间内工作时,我不能执行以下操作:

Company.OtherClass obj;

因为编译器假设我的意思是:

Org.Company.Otherclass obj

这不存在。

所以,据我所知,我实际上必须导入其他命名空间,而不是使用完全限定名称using Company;

然而,问题是我需要OtherClass 从 XML 文件(Castle Windsor 配置文件)中引用它,并且完全限定名称Company.OtherClass不起作用。有没有解决的办法?更改命名空间名称不是一个可行的选择。

编辑: 这就是我在温莎城堡 xml 文件中的内容

<using assembly="MyProj, Version=1.0.0.0, Culture=neutral" />
...
<component
  service="Company.IOtherClass"
  type="Company.OtherClass"
  />

我收到以下错误:

{"Could not convert string 'Company.OtherClass' to a type. Make sure assembly containing the type has been loaded into the process, or consider specifying assembly qualified name of the type."}

可能是因为它向内部看,Org.Company而是在MyProj程序集中定义的。

如果有办法添加另一个引用 Nuget 包的语句,我认为这可以解决<using />......有没有办法做到这一点?

4

3 回答 3

5

据我了解,您的问题是关于从 XML 引用?正确的?

因此,Castle.Windsor 建议“考虑指定类型的程序集限定名称。”。这是什么意思?这意味着,而不是:

<component
    service="Company.IOtherClass"
    type="Company.OtherClass"
/>

您应该使用它们来自的程序集给出类名:

<component
    service="Company.IOtherClass, OtherClassAssembly"
    type="Company.OtherClass, OtherClassAssembly"
/>

甚至是完全限定的程序集名称:

<component
    service="Company.IOtherClass, OtherClassAssembly, Version=..., Culture=..., PublicKeyToken=..."
    type="Company.OtherClass, OtherClassAssembly, Version=..., Culture=..., PublicKeyToken=..."
/>

注意:用实际程序集名称替换 OtherClassAssembly 并且不要在此处添加 .dll 扩展名 注意:有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx,例如如何处理嵌套类

要在代码中使用 OtherClass,你可以使用 global

global::Company.OtherClass

您还可以使用:

using Company;

或者只导入一个类:

using ClassFromOtherCompany = Company.OtherClass;
于 2013-05-15T11:09:59.950 回答
0

您可以使用命名空间别名,例如这个 MSDN 示例:

using Co = Company.Proj.Nested;
于 2013-05-15T10:35:00.953 回答
0

好吧,从问题的描述和您收到的错误消息来看,您的怀疑似乎是正确的。

在 Windsor 运行其安装程序时,Nuget 包中的程序集尚未加载到 AppDomain 中,因此它无法知道Company.OtherClass从何处获取该程序集。

然后,您可以按照错误消息的建议进行操作,并使用程序集限定类型名称,或者使用<using />标记预加载程序集。

于 2013-05-15T10:52:53.347 回答