2017-09-20 64 views
5

Czy istnieje sposób na określenie kosztu sieci w .Net Core 2.0?
ten sposób uzyskać koszty sieciowe w moim kodu C++:Najlepszy sposób na obniżenie kosztów sieci .Net Core 2.0

hr = pNetworkCostManager->GetCost(&dwCost, NULL); 
if (hr == S_OK) { 
    switch (dwCost) { 
    case NLM_CONNECTION_COST_UNRESTRICTED: 
    case NLM_CONNECTION_COST_FIXED:   
    case NLM_CONNECTION_COST_VARIABLE:  
    case NLM_CONNECTION_COST_OVERDATALIMIT: 
    case NLM_CONNECTION_COST_CONGESTED:  
    case NLM_CONNECTION_COST_ROAMING:  
    case NLM_CONNECTION_COST_APPROACHINGDATALIMIT: 
    case NLM_CONNECTION_COST_UNKNOWN: 
    } 
} 

Jedną rzeczą, która .Net rdzeniowy (2.0) ma się NetworkInterfaceType (https://docs.microsoft.com/en-us/dotnet/api/system.net.networkinformation.networkinterfacetype?view=netcore-1.0)

W oparciu o NetworkInterfaceType mogę sprawdzić, czy ma połączenie Wi-Fi, sieć lub komórkę, ale to nie przekłada się na koszt.
Czy istnieje sposób na znalezienie kosztów sieci w .Net Core 2.0?

+0

W twojej próbce C++ skąd pochodzi 'pNetworkCostManager'? – Gimly

+0

@Gimly jest obiektem https://msdn.microsoft.com/en-us/library/windows/desktop/hh448257(v=vs.85).aspx – Mark

+0

Czy próbujesz określić użycie odmierzane lub nieograniczone (np. pieniądze)? Czy próbujesz określić wydajność (bity prędkości/sek)? –

Odpowiedz

3

Aby zadzwonić pod numer GetCost, należy użyć interfejsu COM. Jeśli chcesz wykonać dokładnie to połączenie, tj. Przekazać NULL zamiast adresu IP do GetCost, będziesz musiał sam zdefiniować interfejs COM, aby spełnić Twoje potrzeby, np. tak:

using System; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 

[ComImport, Guid("DCB00C01-570F-4A9B-8D69-199FDBA5723B"), ClassInterface(ClassInterfaceType.None)] 
public class NetworkListManager : INetworkCostManager 
{ 
    [MethodImpl(MethodImplOptions.InternalCall)] 
    public virtual extern void GetCost(out uint pCost, [In] IntPtr pDestIPAddr); 
} 


[ComImport, Guid("DCB00008-570F-4A9B-8D69-199FDBA5723B"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface INetworkCostManager 
{ 
    void GetCost(out uint pCost, [In] IntPtr pDestIPAddr); 
} 

Następnie można uzyskać informacje o kosztach takiego:

new NetworkListManager().GetCost(out uint cost, IntPtr.Zero); 

Jeśli nie ma wymogu przekazywania NULL do GetCost można po prostu dodać odwołanie do typu COM biblioteka "Network List Manager 1.0 Type Library", ustaw "Embed Interop Types" na false i use those definitions.