【发布时间】:2020-01-25 02:24:48
【问题描述】:
我们目前将 ODBC 驱动程序构建为 4 个 DLL:
实现 ODBC (C) API 的 DLL,主要用 C++ 实现, 使用 C++/CLI 编写的一些“胶水”代码,用于与 #2、#3 和 #4 交互
包含托管程序集(用 C# 编写)的 DLL,该程序集定义了用于 #1 和 #4 相互通信的“基本”接口。
- 另一个 DLL 包含一个托管程序集,该程序集依赖于 #2,并为 #2 中的类定义了一些扩展
- 另一个包含托管程序集的 DLL,其中包含“业务 驱动程序的逻辑',取决于#2 & #3
为了部署驱动程序,我们将 DSN 配置为指向 #1,并将 #2、#3 和 #4 放入 GAC。
我们有一位客户想要完全避开 GAC。我知道将 #2、#3 和 #4 与加载 #1 'works'的应用程序放在同一目录中,但这不是一个好的解决方案,因为许多不同的应用程序可能会使用该驱动程序。
我们如何设置它以便在没有 GAC 的情况下解决依赖关系?我尝试创建清单文件(基于https://docs.microsoft.com/en-us/windows/win32/sbscs/assembly-manifests),但这似乎不起作用(EEFileLoadException 异常被抛出,因为它找不到托管程序集,当我从GAC)。我将清单文件和所有 .DLL 文件放在同一个目录中。
通过谷歌搜索,我找不到任何好的文档/示例。
【问题讨论】:
-
您必须放弃 C++/CLI 并自己托管 CLR,这样您就可以在使用主 appdomain 之前对其进行初始化。大改写。报价合适的价格和它自己解决的问题。
-
真的没有“类似清单文件”的方法吗?您必须在运行时实际调用 CLR API?
-
我们目前在入口点使用docs.microsoft.com/en-us/cpp/dotnet/…,硬编码的应用域为 1(意味着是“默认”应用域)。也许我们可以创建自己的 appdomain 并使用它来代替......一位同事正在测试尝试配置 CLR 如何加载程序集,并注意到它延迟加载托管程序集,直到第一次运行托管代码,但仅在32 位,而不是 64 位(不知道为什么)
-
如果每个应用程序都附带 #2 #3 和 #4,真正的问题是什么? “许多不同的应用程序可能会使用驱动程序”是什么意思?
-
当您在机器上安装 ODBC 驱动程序时,任何应用程序都可以使用它。由于 ODBC 是标准 API,因此无法列出所有可能需要考虑的应用程序。
标签: c++ .net manifest gac mixed-mode