我一直在尝试编写一个简单的基于命令行的应用程序(使用Visual Studio 2015和Windows 10中的C#和.NET)来启动一个Wi-Fi Direct广告商{{3但是,手动添加对必要的* .dll和* .winmd程序集的引用,而不是创建UniversalWindowsPlatform项目。 (来自Reffere Assemblies的System.Runtime.WindowsRuntime和来自Windows Kits \ 10 \ Union Metadata \ Windows.winmd的Windows)
这是相关代码:
public void StartAdvertisement(WiFiDirectAdvertisementListenStateDiscoverability discoverability,
bool listenToConnections)
{
if (mPublisher == null)
mPublisher = new WiFiDirectAdvertisementPublisher();
if (listenToConnections)
{
mListener = new WiFiDirectConnectionListener();
mListener.ConnectionRequested += OnConnectionRequested;
}
mPublisher.StatusChanged += OnStatusChanged;
mPublisher.Advertisement.IsAutonomousGroupOwnerEnabled = true;
mPublisher.Advertisement.ListenStateDiscoverability = discoverability;
mPublisher.Start();
}
async void OnConnectionRequested(WiFiDirectConnectionListener sender,
WiFiDirectConnectionRequestedEventArgs connectionEventArgs)
{
// Connection code
}
广告客户启动正常(可以从其他设备找到它,并创建必要的网络接口),但是当其他设备尝试连接时,不会调用OnConnectionRequested方法。我已经看到,对于使用Wi-Fi Direct,通用Windows应用程序必须在其清单中添加Microsoft's Universal Samples,但对于通用应用程序,没有清单。
我是否可以仅通过引用必要的程序集从非通用Windows应用程序使用Windows 10 WiFi Direct API?
答案 0 :(得分:2)
因此,我终于可以使用WinRT API(包括Wi-Fi Direct,即使没有明确声明接近功能使用)来自非通用Windows应用程序,但在Windows 10中比8更有点棘手。或8.1。
编辑项目的* .csproj后,在组内添加以下行...
<TargetPlatformVersion>10.0.10240.0</TargetPlatformVersion>
您将在Reference Manager中看到一个名为Windows的新部分,其中包含winmd库。它们都不会有用,你可能需要的只是两个你必须添加浏览的库:
C:\Program Files (x86)\Windows Kits\10\Union Metadata\Windows.winmd
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
通过这两个引用,您可以避免像
这样的问题&#39;类型XXXX在未引用的程序集中定义&#39;
或
&#39;名称空间XXXX在两个不同的程序集中定义。
但我们还没有完成!特别是在Wi-Fi Direct中,一旦广告客户,广告和其他一些计算机尝试连接,如果您有WiFiDirectConnectionListener的实例,则应调用以下方法
async void OnConnectionRequested(WiFiDirectConnectionListener sender, WiFiDirectConnectionRequestedEventArgs connectionEventArgs)
但是你会得到一个 System.BadImageFormatException 。这是因为System.Runtime.WindowsRuntime.dll实际版本与其清单中声明的版本有所不同,因此无法加载。
在Visual Studio中打开属性工具,选择System.Runtime.WindowsRuntime引用并更改以下属性:将Local复制为false,将Specific Version复制为true。
现在应该可以了!