C# 用户发起的操作实现

C# 用户发起的操作实现,c#,.net,vb.net,security,C#,.net,Vb.net,Security,在Flash 10中,有一些方法要求通过用户启动的操作(如按钮点击、键盘上/下键等)触发它们 有可能在.NET中实现这种行为吗?例如,如果我们有这个子程序: void SomeMethod() { // Here some stuff } 如何在其内部检查该方法是否是从鼠标单击事件处理程序调用的 如果有人知道我的意思的话,我们也可以像魔兽世界中的受保护函数一样考虑这些方法 编辑:看起来这一行为是在Silverlight中实现的-我们只能通过鼠标单击或其他用户启动的操作弹出文件对话框(打开

在Flash 10中,有一些方法要求通过用户启动的操作(如按钮点击、键盘上/下键等)触发它们

有可能在.NET中实现这种行为吗?例如,如果我们有这个子程序:

void SomeMethod() {
   // Here some stuff
}
如何在其内部检查该方法是否是从鼠标单击事件处理程序调用的

如果有人知道我的意思的话,我们也可以像魔兽世界中的受保护函数一样考虑这些方法


编辑:看起来这一行为是在Silverlight中实现的-我们只能通过鼠标单击或其他用户启动的操作弹出文件对话框(打开、保存),否则将抛出SecurityException。我想实现这一点,但在我的情况下,它不是一个文件对话框,而是我们自己的方法。

为什么不将其作为参数提供

void SomeMethod(bool userInitiated) {
   // Here some stuff
}
假设您已经在调用它,有时是从事件处理程序调用,有时不是,那么您已经拥有了该信息

编辑:另一种方法是创建一个线程静态字段,在事件处理程序的入口设置该字段,然后在退出时重置(在finally块中)。任何想要测试它们是否“响应用户操作”的代码都可以测试该字段

如果这还不够好,那么我怀疑答案就是“不”


编辑:您可以访问调用堆栈(请参见类),但这相对较慢,并且可能由于内联而错过堆栈帧。还有一些可能对您有所帮助,但我对此表示怀疑。

您似乎正在编写某种插件API。您希望提供一种方法来执行用户可能不希望执行的操作,例如更改剪贴板内容,并且您希望确保插件只能在响应用户操作时调用该方法

我能想到的唯一方法是,API需要不断地了解它当前是否正在处理用户发起的操作。您的程序中可能会有一些代码调用插件提供的代码,例如

if (plugin.HasHandlerForMouseClick)
    plugin.HandleMouseClick();
此时,您需要记住这是用户发起的操作。方法返回后,用户启动的操作即告结束:

if (plugin.HasHandlerForMouseClick)
{
    _userInitiated = true;
    try
    {
        plugin.HandleMouseClick();
    }
    finally
    {
        _userInitiated = false;
    }
}
然后,在您的“不安全”方法中,例如设置剪贴板的方法,您必须选中此标志:

public void SetClipboard(object newValue)
{
    if (!_userInitiated)
        return;    // or throw AccessDeniedException?

    // set clipboard here
}
正如Jon所暗示的,该字段应该声明为线程静态。这意味着每个线程都有一个单独的字段副本:

[ThreadStatic]
private static bool _userInitiated = false;

你一个问题都不懂。因为安全。在Flash10中,我们不能从不是由用户触发的代码(例如,通过鼠标单击)调用System.setClipboard()。这可以确保用户知道现在会发生什么,并且用户知道如果用户不想要,什么事情都不会发生。@myfirstandlastquestion:问题仍然不是很清楚-您没有提供太多的上下文来说明这段代码是什么,或者您正试图实现什么。我已经编辑了我的答案,但如果没有更多信息,它不太可能非常有用。我们可以检查调用堆栈吗?在Silverlight中,当我们需要打开文件对话框时,这种检查是如何发生的?@Jon Skeet,对不起,也许问题真的还不是很清楚)但让我们一起努力找到解决方案,我将感谢任何帮助way@Jon斯基特,谢谢,我会读的。下面Timwi描述了我想要归档的内容。如果有想法,欢迎你!让我把你的问题转过来:你为什么要检查这个?为什么您认为该方法可能会被不恰当地调用?听起来你在写一些插件系统,你想阻止恶意程序员写一些用户不想要的插件?是的,你注意到了我想做的事情,绝对正确。但现在我不明白什么是HasHandlerForMouseClick和HandleMouseClick,如何链接这个插件和用户?你能解释一下吗?也许点灯光examples@myfirstandlastquestion:我不知道你的插件API中调用了什么方法,所以我不得不编一些东西。