【发布时间】:2020-06-02 20:46:30
【问题描述】:
嘿,这是第一次使用 C++,所以请善待 :)
我已经制作了一个 WinRT 应用程序,由于某种类型的“沙盒”,它为那些应用程序做了我无法访问除此之外的任何东西(比如我想要访问的东西 - 我的桌面应用程序。
所以在这里和那里阅读我发现如果你制作一个 C++ Dll 并从 WinRT 应用程序调用它,那么这将允许你在“沙盒”之外进行调用。但是这里有个小问题。
我目前收到以下错误:
错误 CS1660 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型。
在此处使用此代码:
void Header_Click(object sender, RoutedEventArgs e)
{
DisplayFromDLL("tester", s =>
{
// response is returned in s - do what you want with it
});
}
DisplayFromDLL 是它抛出该错误的地方。 “s”更是如此。
所以我必须调用 dll 的 C# 代码如下所示:
public sealed partial class GroupedItemsPage : Page
{
[DllImport("Win32Project1.dll", EntryPoint = "DisplayFromDLL", CallingConvention = CallingConvention.StdCall)]
public static extern void DisplayFromDLL(string name, String response);
void Header_Click(object sender, RoutedEventArgs e)
{
DisplayFromDLL("tester", s =>
{
// response is returned in s
});
}
还有 C++ dll 代码:
extern "C"
{
__declspec(dllexport) void DisplayFromDLL(const char name)
{
MessageBox("name is: " + name, "Msg title", MB_OK | MB_ICONQUESTION);
}
}
所以一些帮助会很好地了解导致错误的原因以及修复它的情况可能是什么。
【问题讨论】:
-
在同一进程中切换语言不会让您脱离沙箱,这很容易,不是吗?看来您正在使用 UWP(“通用 Windows 平台”)。 WinRT“只是”一个 API。如果你不想要沙盒,就不要使用 UWP,或者在沙盒之外开发另一个进程与之对话(通过某种机制)
-
那么你有什么建议?我不得不留在 WinRT 的唯一原因是为了 Metro Live Tiles。如果我能在 WPF 中得到同样的东西,那么这将解决这个问题。我听说过很多关于“桥”的内容,但并没有真正理解这一切是如何运作的。
-
有 WinRT(新的 Windows API)、UWP 平台(xbox、设备、沙盒等)和打包(msix、标识、沙盒使用)。桌面应用程序可以访问某些 WinRT API,有些则不能。有些需要包标识,有些不需要。所有这一切目前正在发生变化,未来显然是 WinUI3:blogs.windows.com/windowsdeveloper/2020/05/19/… 但现在,我相信您确实可以使用桌面应用程序中的实时磁贴 API(也许有包装,我不确定):blogs.windows.com/windowsdeveloper/2018/11/02/…跨度>
标签: c# c++ dll windows-runtime dllimport