以下代码从RenderAsync方法抛出一个神秘的System.ArgumentException"值不在预期范围内".另一方面,如果我的Canvas是可见的XAML树的一部分,它的工作原理.是否无法呈现屏幕上未显示的某些XAML?
Canvas c = new Canvas();
c.Width = 40;
c.Height = 40;
c.Background = new SolidColorBrush(Color.FromArgb(0xff, 0x80, 0xff, 0x80));
RenderTargetBitmap x = new RenderTargetBitmap();
await x.RenderAsync(c);
Run Code Online (Sandbox Code Playgroud)
我几乎认为这个答案可行,但没有运气,我想它只适用于WPF:在屏幕外创建WPF元素并渲染到位图
更新:
到目前为止,我最好的想法是将我想渲染的Canvas放入当前可见的页面,但是将它放在通常填充屏幕的根UIElement下面,以便用户看不到它:
<Grid>
<Canvas x:Name="HiddenCanvas"/>
<Grid x:Name="mainElement" Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
</Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
它不漂亮,但似乎有效.让我们看看是否有人可以做得更好
c# windows-runtime winrt-xaml windows-store-apps windows-8.1
我认为我追踪了内存泄漏,并想确认我认为Android的Binder如何实现的可能性.在这种情况下,我有一个服务和一个活动,每个都在他们自己的过程中.我创建了一个AIDL,它允许我通过ipc方法将Call从对象传递给Service,然后在服务完成所请求的任务时调用回调.
很长一段时间我都在想:如果我将一个新的Callback对象传递给Service,并且我没有在我的Activity中保留一个指向Callback对象的指针,为什么垃圾收集器不会继续并在我的Activity中收集回调处理?由于这似乎没有发生,JVM如何知道何时在我的Activity中垃圾收集回调.
我认为答案是Binder系统在Activity进程中保留一个指向我的Callback的指针,直到Service进程中相应的Callback对象调用了finalize()方法,然后向Activity发送一条消息以释放指针.它是否正确?如果不是,它是如何工作的?
我相信它是并且它导致有趣的情况,如果活动中的回调指向非常占用内存的东西,则在收集服务中的回调之前不会收集它.如果服务内存不足,它可能不会长时间收集回调,并且回调可能只是在活动中积累,直到活动中出现OutOfMemoryError.
我在Windows运行时环境中将图像实例添加到Canvas,并且在140和180刻度分辨率显示时我的图像不断放大,它在刻度分辨率100中看起来很完美.我尝试创建3个PNG图像,每个刻度尺寸一个:100 ,140,180但它仍然可以扩展它们,它们看起来很模糊.我在青色背景上创建了一个带有4个黑色像素的测试图像,我从模拟器中截取了一个截图,看看图像是如何模糊的,我的原始图像只有4个完美的黑色像素:

我尝试更改我的Image对象的拉伸模式,但它什么也没做.我正在使用此代码在运行时添加图像:
var bitmapImage = new BitmapImage();
StorageFile bitmapFile = await StorageFile.GetFileFromApplicationUriAsync(imageUri);
await bitmapImage.SetSourceAsync(await bitmapFile.OpenReadAsync());
Image image = new Image{ Source = bitmapImage};
image.SetValue(Canvas.LeftProperty, x);
image.SetValue(Canvas.TopProperty, y);
canvas.Children.Add(image);
Run Code Online (Sandbox Code Playgroud)
如何让图像在画布中完美地绘制像素,而不进行缩放和我想要的精确x/y坐标?
我有一个 Binder,我将其发送到远程进程,该远程进程用于linkToDeath监视 Binder 何时终止。现在,当进程崩溃时,远程进程会收到回调,但是有没有办法可以在拥有 Binder 的一侧以编程方式触发 Binder 死亡而不崩溃?
使用RTOS(例如FreeRTOS)时,每个线程都有单独的堆栈空间。那么,ISR(中断服务程序)呢,它们在内存中是否有单独的堆栈?还是可以配置的?
如果它们没有用于存储在ISR中声明的局部变量的堆栈?
我正在尝试在C中编写一个概念证明,演示ARM Cortex-M3上堆栈中的内存缓冲区的代码执行.这将有助于证明正确使用ARM MPU可以防止此类攻击.我想一个快速而肮脏的方法来将一些代码放入堆栈中是从常规函数中复制它然后使用goto跳转到它,如下所示:
static void loopit(void)
{
printf("loopit\n");
while (1);
}
void attack(void)
{
uint8_t buffer[64] __attribute__((aligned(4)));
memcpy(buffer, loopit, sizeof(buffer));
goto *((void *) (int) buffer);
}
Run Code Online (Sandbox Code Playgroud)
我希望当我调用攻击函数时,它会将代码复制到堆栈中,跳转到它,打印消息并进入无限循环.但是,我在故障寄存器中使用以下值获得异常:
HFSR = 0x40000000
CFSR = 0x00020000
PSR = 0x60000000
Run Code Online (Sandbox Code Playgroud)
这似乎是UFSR中的INVSTATE位,表示"非法使用EPSR",我读到的通常是由于BX指令试图跳转到LSB设置为0的地址,处理器将其解释为函数其中包含非Thumb代码,但Cortex-M处理器仅允许Thumb代码.我看到memcpy被赋予了loopit函数的奇数地址,因为我假设编译器正在使用实际内存地址进行ORing 1.所以我认为解决方法是重写我的攻击函数,如下所示:
void attack(void)
{
uint8_t buffer[64] __attribute__((aligned(4)));
memcpy(buffer, ((int) loopit) & ~1, sizeof(buffer));
goto *((void *) ((int) buffer) | 1);
}
Run Code Online (Sandbox Code Playgroud)
但是在这之后我得到了一个与故障寄存器不同的异常:
HFSR = 0x40000000
CFSR = 0x00080000
PSR = 0x81000000
Run Code Online (Sandbox Code Playgroud)
这似乎没有任何意义,UFSR第3位设置意味着"处理器已尝试访问协处理器".看看PC,这次看起来跳跃成功了,这很好,但后来有些东西掉了轨道,CPU看起来正在执行奇怪的指令,而不是进入无限循环.我尝试在goto之前关闭中断并注释掉printf,但没有运气.有什么问题以及如何使其发挥作用?
无法选择主时钟域,因为找不到从“SYSTRACE”到“LINUX_FTRACE_GLOBAL”的路径。
我的 android 应用程序有一个像这样的意图过滤器:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="satur9nine" android:host="*" />
<data android:scheme="http" android:host="www.satur9nine.com" android:pathPrefix="/app" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
它应该匹配 satur9nine://anything 或http://www.satur9nine.com/app/anything。但是它匹配http://www.notmywebsite.com/app,有什么问题?
我正在使用cmocka库来测试一些嵌入式 c 代码。根据文档,我使用__wrap_前缀来模拟函数,这样我就可以隔离我的单元测试。但是,一旦我这样做了,所有对该函数的调用将永远转到被包装的函数。如何在某些情况下重新启用真正的功能,以便我可以测试它或允许其他功能使用它?在我看来,唯一的方法是使用全局字段作为开关来调用真正的函数,如下所示:
int __wrap_my_function(void) {
if (g_disable_wrap_my_function) {
return __real_my_function();
}
// ... do mock stuff
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
如何使用ContentProviderClient与ContentResolver#acquireContentProviderClient(...)任何不同的获得ContentResolver#acquireUnstableContentProviderClient(...)?
似乎无论我使用哪种方法,我都会编写相同的代码。如果获取的 ContentProvider 消失并且我使用非不稳定方法获取客户端,我的应用程序中是否会出现某种泄漏?
所以我猜如果你想使用的 ContentProvider 在同一个进程中运行或者它正在运行,system_server那么你可以继续使用 stable 方法获取客户端,否则你应该使用不稳定的方法以防其他进程崩溃或者托管 ContentProvider 的应用程序在您使用它时被卸载/重新安装。但这让我问,使用稳定版本的获取方法是否有某种优势,为什么不总是使用不稳定版本的方法以防万一?
当他们说以下内容时,他们究竟是什么意思?
如果该内容提供者的进程消失,这将关闭平台中的机制清理依赖于该内容提供者的进程。
我正在研究一个在基于ARM Cortex M3的微控制器上运行的嵌入式项目.我们的供应商提供的一些代码使用延迟功能来设置内置硬件定时器,然后旋转直到定时器到期.通常,这用于等待1到几百微秒.这些延迟几乎是因为它们正在等待一些寄存器,芯片或总线完成一个动作,并且需要至少等待给定的微秒数.硬件计时器的设置开销似乎也至少需要6微秒.
在多线程环境中,这是一个问题,因为有N个线程但只有1个硬件计时器.我可以在使用定时器时禁用中断,以防止上下文切换,从而防止竞争条件但看起来有点难看.我正在考虑将使用硬件定时器的功能替换为使用ARM CPU循环计数器(CCNT)的功能.是否存在我缺少的陷阱或其他替代方案?显然,循环计数器功能需要调整到适当的CPU频率,这对于我们的系统永远不会改变,但我想可以使用硬件定时器以编程方式在启动时检测到.