C# 有一个插件接口,其值为';它只对程序可用,而不是插件本身

C# 有一个插件接口,其值为';它只对程序可用,而不是插件本身,c#,plugins,interface,C#,Plugins,Interface,我制作了一个插件接口,运行得很好,但是由于它执行C#代码,有可能创建恶意插件,因此我考虑计算插件的MD5校验和,并通过可信插件MD5的SQL数据库进行检查,然而,我对接口非常熟悉,我不太确定如何实现这一点,下面是我试图实现的一个示例: //Program ... LoadedPlugin.md5 = PluginFunctions.getMD5(LoadedPlugin); ... string pluginmd5 = SomePlugin.md5; ... //Here it's able t

我制作了一个插件接口,运行得很好,但是由于它执行C#代码,有可能创建恶意插件,因此我考虑计算插件的MD5校验和,并通过可信插件MD5的SQL数据库进行检查,然而,我对接口非常熟悉,我不太确定如何实现这一点,下面是我试图实现的一个示例:

//Program
...
LoadedPlugin.md5 = PluginFunctions.getMD5(LoadedPlugin);
...
string pluginmd5 = SomePlugin.md5;
...
//Here it's able to both set and get the MD5 value.

//The interface
public interface Foo
{
    string Name { get; }
    string md5 { get; set; }
    void OnCalled();
}

//The plugin
public class Plugin : Foo
{
    public Plugin()
    {

    }

    public string Name
    {
        get
        {
            return "Totally trustful plugin";
        }
    }

    public string md5
    {
        get
        {
            return "MD5 of a trustful plugin";
            //This is what I'm trying to prevent from happening!
        }
    }

    public void OnCalled()
    {
        //Malicious code here
    }
}

我该如何阻止设置并可能获得它自己的MD5,但允许程序本身同时获得和设置MD5。

您需要某种插件无法访问的插件元数据对象。加载插件时,您可以跟踪此对象,如果有人需要插件实例,则可以分发您创建的实例

class PluginWithMetaData
{
  public PluginWithMetaData(Foo plugin)
  {
     Plugin = plugin;
     MD5 = PluginFunctions.GetMD5(plugin);
  }

  public Foo Plugin { get; private set; }
  public string MD5 { get; private set; } 
}

顺便说一句,在加载插件后检查散列似乎有点奇怪。当时它可能已经运行了一些恶意代码。加载程序集之前,应该检查程序集的哈希。

@Hna它没有自己的MD5,它是通过
PluginFunctions
类中的
getMD5(Plugin pl)
函数计算的,然后在程序的其他地方进行验证。我试图使使用接口的类完全无法访问该值,但可以从程序中获取和设置该值。谢谢,我在加载插件后检查MD5,并根据其是否为可信插件,除非用户允许,否则无法调用OnEnable、OnDisable和OnCalled函数。