首先我解释我们当前的项目结构,然后是问题陈述
我有一个用于CRM的插件项目,该项目正在引用另一个服务项目。为了部署项目,我使用的是ILMerge,所以当插件项目编译时,它将包含所有服务项目合约和模型。我也在同一个解决方案上创建了单元测试项目,我已经为服务项目编写了测试方法(通过参考服务项目(。所有测试方法工作正常
现在我们改变了策略,在插件项目而不是服务项目上进行单元测试。所以我删除了服务的引用并添加了插件的引用,所有的单元测试仍然在运行时通过。因为在运行时程序集内部包含服务类属性和方法。
但是在编辑单元测试时,我们失去了Visual Studio的智能感知帮助,因为我们没有直接引用服务项目,如果我尝试同时引用服务和插件,那么编译时错误说这些类通过插件存在。
在这里,我想使用智能感知来制作更好的代码,并且也不想出现双重引用问题。
有人可以帮忙吗
我也有这个问题。终于找到了解决办法。
所以你有组装A, B
并将它们合并到M'
(A, B -> M
(。然后你有一个项目Test
你使用来自 A,B,M 的类型。
任何合并的程序集
A
,B
通过常规项目引用。至于
M
组装,我只参考原始M.dll
不包含A, B
类型。此组件放入 M/obj/$(配置名称( 文件夹。(合并M'
程序集位于bin文件夹中(因此,在添加引用时,不要添加项目引用,而是浏览到 ../m/obj/release/m.dll
打开
Test.csproj
并查找<Reference Include="M"> <HintPath>..MobjReleaseM.dll</HintPath> </Reference>
将
HintPath
替换为..Mobj$(ConfigurationName)M.dll
请确保指定解决方案的生成顺序,以便
Test
取决于A,B,M
在合并到M
时,我还尝试内化A, B
类型(公共类型成为内部类型(,但是当您部署到CRM时,代理的东西(即从OrganizationRequset/Response继承的类,在使用Execute方法时必须反序列化(必须是公共的。从内部化中排除这些类型会回到重复的类型错误。
如果您只在测试项目中合并M'
引用,它解决了另一个问题。如果您碰巧在项目中使用了A
中定义的Test
某个接口,并且碰巧测试了也使用此类型的C
功能...错误,它只是抱怨error CS0012: The type 'SomeType' is defined in an assembly that is not referenced. You must add a reference to assembly
.我怀疑这是因为Test
项目中您实际上使用的是程序集M'
类型,它不等同于程序集中使用的A
C
接口。