将项目从.NET 1.1移动到.NET 2.0后,MsBuild会为某些COM对象发出大量警告。
测试示例代码(实际代码无关紧要,仅用于创建警告):
using System;
using System.DirectoryServices;
using ActiveDs;
namespace Test
{
public class Class1
{
public static void Main(string[] args)
{
string adsPath = String.Format("WinNT://{0}/{1}", args[0], args[1]);
DirectoryEntry localuser = new DirectoryEntry(adsPath);
IADsUser pUser = (IADsUser) localuser.NativeObject;
Console.WriteLine("User = {0}", pUser.ADsPath);
}
}
}
警告信息如
C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Microsoft.Common.targets:警告:运行时封送程序无法对“ITypeLib.RemoteGetLibAttr”的至少一个参数进行封送处理。因此,这些参数将作为指针传递,并且可能需要操作不安全的代码。
观察:
<Reference>
条目包含属性WrapperTool = "tlbimp"
知道如何摆脱警告吗?
答案 0 :(得分:12)
我遇到了同样的问题并通过编辑项目文件(.csproj)来修复它,遵循以下建议:
我将以下密钥添加到每个构建配置的属性组中:
<ResolveComReferenceSilent>True</ResolveComReferenceSilent>
答案 1 :(得分:6)
根据MDSN article about TLBIMP for 2.0中的评论,您无法自行解决此问题,无法自行运行TLBIMP。
使用VS很容易重现您的问题。我还从VS注释提示中手动运行了TLBIMP:
tlbimp c:\WINNT\system32\activeds.tlb /out:interop.activeds.dll
解决方法是使用/ silent开关
tlbimp c:\WINNT\system32\activeds.tlb /silent /out:interop.activeds.dll
正如MSDN文章中的注释所指出的,COM引用成为您自己构建的互操作程序集的.net程序集引用。
我不是VS专家,但我通过在项目中添加prebuild来完成这项工作:
"$(DevEnvDir)\..\..\SDK\v2.0\bin\tlbimp" c:\WINNT\system32\activeds.tlb
/namespace:ActiveDs /silent /out:"$(ProjectDir)interop.activeds.dll"
构建一次,所以我有一个dll来添加浏览选项卡的引用。在我的项目根目录中添加了对interop.activeds.dll的引用,然后再次构建。您可能希望以其他方式执行此操作,例如通过C ++项目使用外部make文件。这更像是一个POC。
注意MSBUILD与VS的一个有趣的区别,$(DevEnvDir)有一个尾随反斜杠,但MSBUILD没有。
答案 2 :(得分:-2)
您可以使用以下命令停止警告:
#pragma warning disable warning-list #pragma warning restore warning-list
其中警告列表是警告编号的逗号分隔列表。
警告意味着您要导入的类型库包含不可翻译到托管代码中的内容,但可以使用指针操作在不安全的代码块中处理。代码在.Net 1.1中也是不可翻译的,但编译器并不够聪明,如果您使用其中一种警告您的方法,则可能会警告您可能会遇到的陷阱。