事件AppDomain.AssemblyResolve未在COM服务器

时间:2018-05-07 13:49:04

标签: c# .net com

如果通过COM启动注册它的应用程序,则似乎不会触发事件AppDomain.AssemblyResolve。相反,如果应用程序由它自己启动而没有COM,则会定期调用事件处理程序。

在事件文档中声明,如果注册了多个处理程序,则会按顺序调用它们,直到返回非null值。我无法控制COM客户端,所以我不知道这是否是缺少调用的原因,但我在编译后删除了引用的程序集,因此没有其他处理程序应该能够返回非null值。 / p>

您是否知道这可能是事件处理程序未被触发的原因,或者是否有其他我不知道的事情?

COM服务器的示例如下:

public class cPlugin {

    public void Main(object obj1, object obj2) {
        Initialize();
        RealMain();
    }

    private void Initialize() {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
    }

    private void RealMain() {
        ClassLibraryHelloWorld.Class1 cl = new ClassLibraryHelloWorld.Class1();
        cl.SayHello();
    }

    private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
        //This handler is called only when the common language runtime tries to bind to the assembly and fails.

        //Retrieve the list of referenced assemblies in an array of AssemblyName.
        Assembly MyAssembly, objExecutingAssemblies;
        string strTempAssmbPath = "";

        objExecutingAssemblies = Assembly.GetExecutingAssembly();
        AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

        //Loop through the array of referenced assembly names.
        foreach (AssemblyName strAssmbName in arrReferencedAssmbNames) {
            //Check for the assembly names that have raised the "AssemblyResolve" event.
            if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(","))) {
                //Build the path of the assembly from where it has to be loaded.
                strTempAssmbPath = "C:\\Myassemblies\\" + args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
                break;
            }

        }
        //Load the assembly from the specified path. 
        MyAssembly = Assembly.LoadFrom(strTempAssmbPath);

        //Return the loaded assembly.
        return MyAssembly;
    }
}

ClassLibraryHelloWorld是应该在运行时加载的类,它作为引用包含在服务器中,不能在本地复制。

修改

我发现问题与COM无关。事实上,我已经创建了一个测试COM客户端,并发现该事件被正确触发。所以问题出在真正的COM客户端,这是一个不在我控制范围内的第三方程序 使用调试器,我发现事件处理程序已经在真正的COM客户端中定义,我很确定它在尝试搜索程序集时没有返回null。因此,我的处理程序未被调用,并抛出异常。

新问题是:在此方案中,动态加载程序集whitout AppDomain.AssemblyResolve事件的最佳选择是什么?我应该创建一个新的AppDomain吗?

0 个答案:

没有答案