我有一个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路径或它们的一些选项?
还有其他想法吗?
谢谢
答案 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))。
我想知道是否有更清洁的解决方案。