我正在开发一个 wcf 项目并使用 autofac,它正在工作。 但是,我的要求是我将在不同的系统上部署此服务,并且它需要使用这些系统上存在的程序集。 例如我的 wcf 使用 Assembly1 和 Assembly2,我可以在我的电脑上的项目中引用这些程序集并构建服务,它运行良好。
但是,这些程序集在部署 wcf 的不同系统上将具有不同的版本。所以我不能只使用 wcf 服务发送我的程序集。我在我首先在 autofac 中注册的类构造函数之一中配置了下面的 AssemblyResolver,并尝试从复制这些程序集的不同路径加载 Assembly1 和 Assembly2,并尝试通过 Assembly.LoadFrom 加载它。
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
但是当我从 PostBuildEvent 中的 wcf bin 文件夹中删除 Assembly1 和 Assembly2 时,并认为 ResolveAssembly 应该在提供的文件夹中查找这些程序集。但它不会尝试使用 ResolveAssembly 事件处理程序加载程序集。 Wcf 服务在下面一行失败,表示找不到 Assembly1 或 Assembly2。
AutofacHostFactory.Container = container;
看起来您遇到的问题是,
.NET
可能会在AssemblyResolve
事件有机会处理这些程序集的缺失之前加载程序集。如果您的安装代码 AssemblyResolve
已经引用了这些程序集中的示例,则可能会发生这种情况。
您需要确保在应用程序启动后、在尝试查找任何外部程序集之前您订阅了
AssemblyResolve
事件。这意味着在您的 Main
方法或应用程序的入口点开始时进行设置。
它可以看起来像这样:
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
// Other startup code can go here
}
确保使用应用程序所需的确切版本的程序集不会给您的应用程序带来任何意外。如果每个部署中的版本都不同,您可能不想在项目中引用特定版本。
其他一些提示:
Fusion Log Viewer (fuslogvw.exe)
,检查装配装订是否绊倒。 装配绑定日志查看器Autofac
容器知道分数并在动态装配加载准备就绪后进行设置。