C#VS2015 Express:无法解析主要引用...因为它与.NET Framework程序集间接依赖

时间:2018-03-22 11:38:49

标签: c# .net visual-studio-2015 com .net-2.0

我有一个C#“MyAssembly”.NET 2.0程序集,由C#“MyAssemblyTester”.NET 2.0 exe引用。 我正在使用Visual Studio Express 2015。 这两个项目都可以编译并正常工作。

如果我添加到“MyAssembly”项目引用一个非常古老的OCX(2000年之前:Teechart Pro Activex 4.0.1.7,但我遇到与其他旧的COM DLL组件相同的问题)并重新编译,“MyAssembly”项目编译和链接很好,但我对“MyAssemblyTester”有很多错误:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="curriculum">
<table>
  <tbody>
    <tr>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
</tr>
<tr>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td></td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
</tr>
<tr>
  <td></td>
  <td></td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td></td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td></td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td></td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td></td>
</tr>
<tr>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td></td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit</td>
  <td></td>
    </tr>
   </tbody>
 </table>
</div>

如果我将“MyAssembly”和“MyAssemblyTester”的目标框架更改为.NET 4.0,问题就解决了。但是,由于向后兼容性,我希望有一个.NET 2.0目标框架。

我认为问题的根源是VS2015生成的Interop程序集(AxInterop.TeeChart.dll和Interop.TeeChart.dll)以.NET 4.0为目标。 实际上,AxInterop.TeeChart.dll的ILSpy输出是:

2>------ Rebuild All started: Project: MyAssemblyTester, Configuration: Debug x86 ------
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3268: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the framework assembly "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "MyAssembly" or retarget your application to a framework version which contains "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Deployment, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Runtime.Serialization.Formatters.Soap, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3258: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the .NET Framework assembly "System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which has a higher version "4.0.0.0" than the version "2.0.0.0" in the current target framework.
2>C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3268: The primary reference "MyAssembly" could not be resolved because it has an indirect dependency on the framework assembly "System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" which could not be resolved in the currently targeted framework. ".NETFramework,Version=v2.0". To resolve this problem, either remove the reference "MyAssembly" or retarget your application to a framework version which contains "System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".

和Interop.TeeChart.dll类似。

详细构建日志的一些部分(1&gt;是MyAssembly,2&gt; MyAssemblyTester):

// AxInterop.TeeChart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

// Global type: <Module>
// Architecture: AnyCPU (64-bit preferred)
// Runtime: .NET 4.0

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Windows.Forms;

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AxHost.TypeLibraryTimeStampAttribute("05/13/2009 16:17:54")]

// System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// Interop.TeeChart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

如何手动更改Interop程序集的目标框架? 也许我需要更改AxImp和TlbImp路径或它们的一些选项?

还有其他想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我终于解决了安装&#34; Microsoft Windows SDK for Windows 7和.NET Framework 3.5 SP1&#34;,然后添加到&#34;构建后事件命令行&#34;:

"C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\TlbImp.exe" C:\Windows\SysWOW64\teechart.ocx /namespace:TeeChart /machine:X86 /out:$(TargetDir)\Interop.TeeChart.dll /sysarray /transform:DispRet /reference:"C:\Program Files (x86)\ABCD\abcdSDK\DLL\x86\abcdsdk.dll" /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:C:\Windows\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll
"C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\AxImp.exe" C:\Windows\SysWOW64\teechart.ocx /out:$(TargetDir)\AxInterop.TeeChart.dll /rcw:$(TargetDir)\Interop.TeeChart.dll

(从详细构建日志中复制命令,将AxImp和TlbImp的路径更改为3.5 SDK,并将Interop程序集的输出路径从obj \ x86 \ Debug更改为$(TargetDir))。

我想知道是否有更清洁的解决方案。