0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DoCallBack
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain newDomain = AppDomain.CreateDomain("New Domain");
            Console.WriteLine(newDomain.BaseDirectory);
            newDomain.DoCallBack(new CrossAppDomainDelegate(SayHello));
            AppDomain.Unload(newDomain);
        }
    }
}

我想在新的应用程序域中调用 SayHello() 方法。让我们假设,HelloMethod DLL 是第三方,我没有代码。我只有组装。但我知道它有 SayHello() 方法。我能做些什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloMethod
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        static void SayHello()
        {
            Console.WriteLine("Hi from " + AppDomain.CurrentDomain.FriendlyName);
        }
    }
}

在此当前代码中,其给出错误“当前上下文中不存在名称'SayHello'”

4

1 回答 1

2

如果尚未加载程序集,则必须加载它。有两种方法可以做到这一点:

  1. 从您的项目中引用程序集并简单地执行以下操作:

    newDomain.DoCallBack(new CrossAppDomainDelegate(HelloMethod.Program.SayHello));
    

    如果您不介意在自己的项目中引用第三方程序集,这没关系。这也意味着您在编译时就知道要调用的程序集、类型和方法。

  2. 自己加载第三方程序集,执行具体方法:

    /// <summary>
    /// To be executed in the new AppDomain using the AppDomain.DoCallBack method.
    /// </summary>
    static void GenericCallBack()
    {                       
        //These can be loaded from somewhere else like a configuration file.
        var thirdPartyAssemblyFileName = "ThirdParty.dll";
        var targetTypeFullName = "HelloMethod.Program";
        var targetMethodName = "SayHello";
    
        try
        {
            var thirdPartyAssembly = Assembly.Load(AssemblyName.GetAssemblyName(thirdPartyAssemblyFileName));
    
            var targetType = thirdPartyAssembly.GetType(targetTypeFullName);
    
            var targetMethod = targetType.GetMethod(targetMethodName);
    
            //This will only work with a static method!           
            targetMethod.Invoke(null, null);             
        }
        catch (Exception e)
        {
            Console.WriteLine("Callback failed. Error info:");
            Console.WriteLine(e);
        }
    }
    

    如果您正在寻找一种更灵活的方式来从第三方程序集中调用公共静态方法,则可以使用此方法。请注意,几乎所有内容都在 try-catch 中,因为这里很多东西都可能出错。这是因为这些“反射”调用中的每一个都可能引发异常。最后请注意,要使这种方法起作用,第三方程序集及其所有依赖项都位于应用程序的基本目录或私有 bin 路径之一中。

于 2013-02-22T19:07:52.447 回答