12

プロジェクトを .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' の少なくとも 1 つの引数をランタイム マーシャラーでマーシャリングできません。したがって、このような引数はポインターとして渡され、操作には安全でないコードが必要になる場合があります。

所見:

  • ActiveDs (11 個の警告) および MSXML2 (54 個の警告) で発生します。
  • 独自の COM オブジェクトでは見られません。
  • <Reference>.csproj ファイルのエントリに属性が含まれていますWrapperTool = "tlbimp"
  • すべての警告にもかかわらず、実行中のシステムで問題は観察されていません。

警告を取り除く方法はありますか?

4

3 に答える 3

14

私は同じ問題を経験し、ここからの提案に従って、プロジェクト ファイル (.csproj) を編集して修正しました。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/7a7c352b-20cb-4931-b3b5-27e899016f75/turning-off-msbuild-warnings-msb3305?forum=msbuild

各ビルド構成のプロパティ グループに次のキーを追加しました。

<ResolveComReferenceSilent>True</ResolveComReferenceSilent>
于 2015-10-19T11:40:53.080 に答える
6

TLBIMP for 2.0 に関する MDSN 記事のコメントによると、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 の専門家ではありませんが、次のプロジェクトにプレビルドを追加して、この作業を行いました。

    "$(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 にはありません。

于 2009-09-10T00:29:27.800 に答える