假设我在名为Org.Company
的名称空间内工作,并且该名称空间包含MyClass
。
我还要导入一个名为Company
的命名空间的nuget,其名为OtherClass
。
因此,当我在Org.Company
命名空间内工作时,我无法执行以下操作:
Company.OtherClass obj;
因为编译器假定我的意思是:
Org.Company.Otherclass obj
不存在。
所以,据我所知,我实际上必须导入其他命名空间而不是使用完全限定名称using Company;
但问题是,我需要从XML文件(Castle Windsor配置文件)中引用此OtherClass
,而不是完全限定名称Company.OtherClass
工作。
有没有解决的办法?更改命名空间名称不是一个可行的选择。
修改 这就是我在Castle Windsor 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 />
语句,可以解决这个问题......有没有办法做到这一点?
答案 0 :(得分: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::Company.OtherClass
你也可以使用:
using Company;
或只导入一个类:
using ClassFromOtherCompany = Company.OtherClass;
答案 1 :(得分:0)
您可以使用名称空间别名,例如此MSDN示例:
using Co = Company.Proj.Nested;
答案 2 :(得分:0)
嗯,从问题的描述和你得到的错误信息来判断你的怀疑是正确的。
当Windsor运行其安装程序时,Nuget包中的程序集尚未加载到AppDomain中,因此无法知道从哪里获取Company.OtherClass
。
然后,您可以按照错误消息的建议执行操作,并使用程序集限定类型名称,或使用<using />
标记预加载程序集。