c# - 如何在AppDomain内的程序集中调用静态方法

标签 c# .net runtime appdomain

我有以下类(class)(为了便于阅读而缩短)

public class Connection
{
    Guid _id;
    AppDomain _appDomain;
    Type _coreApp;

    public string ConnectionName
    {
        get
        {
            this._coreApp.InvokeMember("_some_property_", BindingFlags.GetProperty, null, null, null).ToString();
        }
    }

    public Connection(string username, string password)
    {
        this._id = Guid.NewGuid();
        this._appDomain = AppDomain.CreateDomain(this._id.ToString());
        Assembly asm = this._appDomain.Load("_some_dll_");
        this._coreApp = asm.GetExportedTypes().First(t => t.Name == "_some_type_");
        this._coreApp.InvokeMember("_some_method_", BindingFlags.InvokeMethod, null, null, new object[] { username, password });
    } 
}

我还有以下代码

public class Main()
{
    public Main()
    {
        Connection connOne = new Connection("_some_user_1_", "_some_pw_1_");
        Connection connTwo = new Connection("_some_user_2_", "_some_pw_2_");

        string nameOne = connOne.ConnectionName;
        string nameTwo = connTwo.ConnectionName;
    }
}

我还得到了这些事实:

  • 我加载到 AppDomain 中的 dll 是第三方
  • _some_method_ 和 _some_property_ 是静态的
  • ConnectionName 应为两个实例返回不同的值,因为参数不相同。

最后我遇到了这个问题:

我的假设是,从自己的 AppDomain 中的 DLL 内的类型调用静态方法,会将该调用与其他人对单独 AppDomain 中同一 DLL 中相同静态方法的调用隔离开来,但由于某种原因,这事实并非如此。例如,如果我运行这样的代码,我会将两个字符串获取为“result_1”,反转参数会将两个字符串设置为“result_2”。

我基本上需要完全隔离 Connection 的每个实例上的 dll,因为有很多静态的事情正在发生,而且我不能让其中一个改变另一个,就像这种情况一样。

我不确定代码是否可以编译,请忽略任何语法或语义问题,因为我无法发布实际的代码,不得不在浏览器上即时编写。

最佳答案

我同意@RonBeyer。您的所有代码和方法/属性调用都在与 Main 类相同的 AppDomain 中运行。事实上,您实例化一个新的 AppDomain 并执行 AppDomain.Load 并不意味着您现在正在您创建的其他 AppDomain 内运行代码。最终,您要做的就是从程序集中获取导出的类型,然后调用其中一种类型的属性/方法。但您没有表示调用将在其他 AppDomain 中发生。

有关进行跨 AppDomain 调用的一些信息,请参阅这些帖子:

Simplest way to make cross-appdomain call?

Cross AppDomain call is executed in caller Domain

关于c# - 如何在AppDomain内的程序集中调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29958221/

相关文章:

c# - SQL Azure 每 10 秒延迟响应一次

android - 为 AnalogClock 小部件动态设置可绘制对象

c# - 在 WP7 中下载内容期间在 UI 中卡住

c# - Paypal 休息 c# : how to Attach pdf file to invoice?

c# - 更改 system.io.port datareceived 事件输出类型

android - 我在运行应用程序时收到 SQLCipher 错误

ios - 链接到框架在 iOS 中如何工作?

c# - Mapper 类中的参数超出范围异常

c# - 有没有办法在不使用 Thread.Sleep 的情况下延迟 ASP.NET MVC 4 中的 HTTP 响应?

c# - linq2db:无法为表生成 POCO