将项目从.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"的至少一个参数进行封送处理.因此,这些参数将作为指针传递,并且可能需要操作不安全的代码.
观察:
发生ActiveDs(11个警告)和MSXML2(54个警告).
没有看到我们自己的COM对象.
.csproj文件中的条目包含属性 WrapperTool = "tlbimp"
尽管有所有警告,但在运行系统中没有发现任何问题.
知道怎么摆脱警告吗?
我遇到了同样的问题并通过编辑项目文件(.csproj)修复了它,遵循以下建议:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/7a7c352b-20cb-4931-b3b5-27e899016f75/turning-off-msbuild-warnings-msb3305?forum=msbuild
我将以下密钥添加到每个构建配置的属性组中:
True
根据MDSN关于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没有.