0

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

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

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 而不是新的?

4

2 回答 2

0

我找出了问题的原因。

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

底线:如果您正在加载一个 dll,然后您尝试加载另一个具有相同强名称的 dll,则将使用第一个 dll。

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

于 2012-09-19T11:53:46.963 回答
0

它也发生在我身上。我从动态加载 dll 的目录中删除了所有额外的 dll(它们的依赖项之前已使用我的主 exe 加载)。你回答的理由是对的。

于 2012-10-10T08:45:52.033 回答