Visual Studio 2015 ソリューションに複数のプロジェクトがあります。これらのプロジェクトのいくつかは、次のような P/Invoke を行います。
[DllImport("IpHlpApi.dll")]
[return: MarshalAs(UnmanagedType.U4)]
public static extern int GetIpNetTable(IntPtr pIpNetTable, [MarshalAs(UnmanagedType.U4)]
ref int pdwSize, bool bOrder);
そこで、すべての P/Invokes を別のクラス ライブラリに移動し、単一のクラスを次のように定義しました。
namespace NativeMethods
{
[
SuppressUnmanagedCodeSecurityAttribute(),
ComVisible(false)
]
public static class SafeNativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int GetTickCount();
// Declare the GetIpNetTable function.
[DllImport("IpHlpApi.dll")]
[return: MarshalAs(UnmanagedType.U4)]
public static extern int GetIpNetTable(IntPtr pIpNetTable, [MarshalAs(UnmanagedType.U4)]
ref int pdwSize, bool bOrder);
}
}
他のプロジェクトから、このコードは次のように呼び出されます。
int result = SafeNativeMethods.GetIpNetTable(IntPtr.Zero, ref bytesNeeded, false);
すべてがエラーまたは警告なしでコンパイルされます。
コードで FxCop を実行すると、次の警告が表示されます。
警告 CA1401 P/Invoke 'SafeNativeMethods.GetIpNetTable(IntPtr, ref int, bool)' のアクセシビリティを変更して、アセンブリの外部から見えないようにします。
Ok。次のようにアクセシビリティを internal に変更します。
[DllImport("IpHlpApi.dll")]
[return: MarshalAs(UnmanagedType.U4)]
internal static extern int GetIpNetTable(IntPtr pIpNetTable, [MarshalAs(UnmanagedType.U4)]
ref int pdwSize, bool bOrder);
次のハード エラーが発生するようになりました。
エラー CS0122 'SafeNativeMethods.GetIpNetTable(IntPtr, ref int, bool)' は、保護レベルが原因でアクセスできません
では、エラーや警告なしでこれを機能させるにはどうすればよいでしょうか?
私は何時間も輪になっていたので、助けてくれてありがとう!