在interop(C ++托管)项目中使用C#dll(使用Microsoft.bcl构建)

时间:2016-10-26 09:44:42

标签: c# c++ c#-4.0 clr base-class-library

我们在.net4.0中使用了C#DLL,但是使用Microsoft.bcl,Microsoft.bcl.async,Microsoft.bcl.build,Microsoft.net.http构建。这些库来自nuget。我们有理由不转移到.net4.5但想要使用async,等待来自这些bcl库。 在C#项目中一切正常,但我们无法在C ++互操作项目中添加此DLL,我们收到此错误:

当我们尝试将此引用添加到项目时,我们收到此错误。

即使clr interop项目也在.net4.0和我们添加的DLL也在.net4.0中我们最终得到此错误。有办法解决这个问题吗?

Error in text format:
---------------------------
Microsoft Visual Studio
---------------------------
Could not add a reference to:

C:\xxx\xxx\xx\xxxHelper.dll



For one of the following reasons:

    - Targets a higher version of the .NET Framework

    - Not a .NET assembly

    - Not a registered ActiveX control
---------------------------
OK   
---------------------------

重现此问题的代码:https://dl.dropboxusercontent.com/u/1967630/BCL_Problem/oAuth2_SDK_consumer_DLL/BCL_Problem_projects.zipx

2 个答案:

答案 0 :(得分:3)

我责备,确实看起来像个臭虫。从屏幕截图中的错误消息判断,您使用的是VS2013。非常无益的消息,它在VS2015中降低了但仍然失败了。奇怪的错误btw,似乎它对待你的C#项目用作框架程序集的Microsoft.Threading.Task程序集引用。我之前没有关于这个问题的SO问题,大多数程序员在不必打机的情况下做到了这一点。

您应该考虑按照这样做的方式来避免此错误。如果使用“添加引用”对话框中的“浏览”按钮,则只会出错。但是在使用项目引用时工作得很好,这是大多数程序员喜欢配置解​​决方案的方式。所以使用File>添加>现有项目,选择您的C#项目。然后再次添加引用,但这次从Solution>中选择C#项目。项目列表而不是使用“浏览”按钮。

如果出于某种原因这是不受欢迎的,那么你可以用另一种方式解决这个问题。在文本编辑器中打开你的.vcxproj,记事本很好。找到这个元素:

   <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>

将版本号修改为v4.5。现在像使用Browse按钮一样添加引用,这次没有任何抱怨。然后返回记事本并将版本号更改回v4.0

答案 1 :(得分:0)

如果没有其他帮助,您可以尝试反编译您的DLL。 .Net组件很容易反转。

再次编译可能会解决问题(例如,你的nuget中的dll可能看起来是4.5,而不是4.0)。