【问题标题】:.net remoting dependency / reference issue.net 远程依赖/参考问题
【发布时间】:2009-06-05 04:01:43
【问题描述】:

我正在维护一个使用远程处理调用远程服务器对象来订购信用报告的 asp.net Web 应用程序。调用“在我的机器上运行”,但在从生产服务器(运行 64 位版本的 .net 框架)运行时抛出异常“无法加载文件或程序集‘choicepointClue’”。

我通过将choicepointClue.dll 复制到Web 应用程序的bin 目录解决了这个问题。但我不明白为什么它需要在那里,因为它是远程服务器库而不是客户端的依赖项。

依赖树如下所示:

Web 应用程序 -->choicepointClueClient -->choicepointRemoteAgent -->choicepointClue

choicepointRemoteAgent 库中没有为类定义接口(应该有),所以它被choicepointClueClient 直接引用。

使用 Activator.GetObject() 实例化来自choicepointRemoteAgent 的类。正是在这一点上,我希望choicepointClue.dll 加载到远程服务器上,而不是运行时尝试从Web 应用程序的bin 目录加载它。

我脑海中闪过的一个古怪理论是,在 x64 和 x86 上加载程序集的方式是不同的。

所以在 x64 上它会在加载choicepointRemoteAgent 后立即尝试加载choicepointClue,而在 x86 上它在显式调用之前不会尝试加载 chiocepointClue?

显然我不知道这里发生了什么。任何人都可以对此有所了解吗?

【问题讨论】:

    标签: .net dependencies remoting 64-bit


    【解决方案1】:

    如果正在使用的类型是在choicepointClue.dll 中定义的,则它需要在远程处理的客户端和服务器端都存在。

    为了使用它,客户端需要知道正在构建的内容的类型信息。这并不意味着它在客户端上被实例化 - 但为了知道如何使用对象(甚至是远程),两端都需要知道基本接口。

    【讨论】:

    • choicepointClue.dll 中的类被远程服务器上的choicepointRemoteAgent 使用。在我看来,客户端应该只需要知道choicepointRemoteAgent 的类型信息。否则为什么它会在没有choicepointClue.dll 的情况下在我的本地机器上工作?起初我以为它一定是在 bin 目录以外的地方找到它,但我已经验证它在本地任何地方都不存在。
    • choicePointClient 使用的类型在哪里定义?通常,您需要将“共享”接口/类放在单独的程序集中,因为这些类型需要对客户端和服务器都可用。
    • 客户端使用的类型在choicepointRemoteAgent中定义。如您所料,在单独的程序集中没有共享接口。客户端和服务器上都存在choicepointRemoteAgent.dll。
    • 这就是问题所在。为了理解和使用类型,choicePointClient 需要加载choicePointRemoteAgent.dll。为了加载choicePointRemoteAgent,该DLL的依赖项必须可用并加载(包括choicepointClue.dll)。
    • 我想我会同意这一点。我很困惑,因为它可以在我的开发电脑上运行,没有选择点Clue.dll。你怎么解释?
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2017-10-07
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多