我正在构建一个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将被加载而不是新的?
答案 0 :(得分:0)
我找出了问题的原因。
有一些外部代码将dll版本改为常量值,因此强名称是相同的。
buttom line:如果你加载了一个dll然后你尝试加载另一个具有相同强名称的dll,那么将使用第一个dll。
为了加载2个具有相同名称的dll,它们必须具有不同的强名称。
答案 1 :(得分:0)
它也发生在我身上。我从动态加载dll的目录中删除了所有额外的dll(它们之前已经加载了我的主exe的依赖项)。你答案的原因是正确的。