动态加载dll时找不到的方法

时间:2012-09-13 14:02:25

标签: c# .net

我正在构建一个C#.net 3.5应用程序。

我有一个exe'MainApp'引用了一个dll'CommonDll'

CommonDll动态加载另一个dll'LoadedDll'并动态调用一个名为func()的方法。

'LoadedDll'引用'CommonDll'

在'CommonDll'中有一个方法foo(),func()正在调用它。

    func()
    {
        foo();
    }

那么,到目前为止我们有什么:

MainApp ==> CommonDll ==动态==> LoadedDll

LoadedDll ==> CommonDll。

一切正常,直到我改变方法foo()得到一个布尔参数:foo(bool val);并且还将'LoadedDll'中的func()与

联系起来
func()
{
foo(true);
}

我在版本1.0中有MainApp(引用旧的CommonDll),在1.1版中有LoadedDll(引用新的CommonDll)

出于某种原因,我在方法foo上得到一个“MethodNotFound Excepion”,说它无法找到获取布尔参数的foo。

为什么会这样? LoadedDll使用对更新后的CommonDll的静态引用,为什么它找不到该方法?

此外,异常并未说它无法找到动态加载的'func()'方法,但它表示无法找到foo方法。

修改

我在GAC中查找了dll,但它不在那里,还有另一个原因,为什么已经在内存中的旧dll将被加载而不是新的?

2 个答案:

答案 0 :(得分:0)

我找出了问题的原因。

有一些外部代码将dll版本改为常量值,因此强名称是相同的。

buttom line:如果你加载了一个dll然后你尝试加载另一个具有相同强名称的dll,那么将使用第一个dll。

为了加载2个具有相同名称的dll,它们必须具有不同的强名称。

答案 1 :(得分:0)

它也发生在我身上。我从动态加载dll的目录中删除了所有额外的dll(它们之前已经加载了我的主exe的依赖项)。你答案的原因是正确的。