防止 .NET 在 COM 调用期间重用程序集
Prevent .NET from reusing assembly during COM call
我正在创建一个带有 COM 接口的 .NET 程序集。理想情况下,我希望将注册表项与程序集分开,因此执行发布只需要将 .dll 放到共享驱动器上(而不是每次都需要推出 MSI)
我创建了不同的 class 继承自主要 class 的元素,以便为每个环境获取不同的 GUID。
然而,当我对此进行测试时,加载的第一个版本(例如开发)最终会在稍后为其他环境(例如测试)提供服务调用。这通常不是问题,但是当使用此组件时,会从全天 运行 GUI 可执行文件中调用该组件。可以想象,人们可能整天处于 运行 不同的环境中。
每个接口在注册表中都有一个独立的代码库集(无 GAC),进程监视器显示两个程序集都已加载,但只使用了第一个。我认为这是因为 .NET 看到相同的 class/assembly 名称并重新使用第一个加载的名称。
在这种情况下如何隔离程序集?
您可以强命名程序集(Visual Studio 中项目属性中的 "signing" 选项卡,不要与 Authenticode 签名混淆)并更改版本号、public 密钥或两者不同 versions/environments。这样 CLR 程序集加载器将认为它们不同,并且不会绑定到已经在给定上下文中加载的那个。
我正在创建一个带有 COM 接口的 .NET 程序集。理想情况下,我希望将注册表项与程序集分开,因此执行发布只需要将 .dll 放到共享驱动器上(而不是每次都需要推出 MSI)
我创建了不同的 class 继承自主要 class 的元素,以便为每个环境获取不同的 GUID。
然而,当我对此进行测试时,加载的第一个版本(例如开发)最终会在稍后为其他环境(例如测试)提供服务调用。这通常不是问题,但是当使用此组件时,会从全天 运行 GUI 可执行文件中调用该组件。可以想象,人们可能整天处于 运行 不同的环境中。
每个接口在注册表中都有一个独立的代码库集(无 GAC),进程监视器显示两个程序集都已加载,但只使用了第一个。我认为这是因为 .NET 看到相同的 class/assembly 名称并重新使用第一个加载的名称。
在这种情况下如何隔离程序集?
您可以强命名程序集(Visual Studio 中项目属性中的 "signing" 选项卡,不要与 Authenticode 签名混淆)并更改版本号、public 密钥或两者不同 versions/environments。这样 CLR 程序集加载器将认为它们不同,并且不会绑定到已经在给定上下文中加载的那个。