gpt4 book ai didi

c# - 将程序集加载到 WindowsAzure WorkerRole 中的单独 AppDomain 中

转载 作者:行者123 更新时间:2023-11-30 15:34:33 24 4
gpt4 key购买 nike

我正在开发一个 Azure 辅助角色,该角色需要根据从 WCF 服务提取的工作定期执行操作。由于 Azure 部署的性质,我们决定在 Azure 中实现一个插件框架,以允许快速更新我们的产品,同时通过消除完整 azure 部署的需要以及支持各种程序集的多个版本来最大限度地减少停机时间。

插件从云存储下载并加载到包含加载程序集所需的所有相关信息的类中。 (请参阅下面的 PluginAssemblyInfo)

在其他开发工作中,我开发了以下 ReflectionHelper 类。此类适用于其他应用程序,并且我已经验证它适用于控制台应用程序。

但是,当在 Azure 模拟器中运行时,我收到以下错误:(我在引发异常的行上添加了注释。)

Type is not resolved for member 'MyCompanyName.ReflectionHelper,MyCompanyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

ReflectionHelper 类作为源文件添加到调用它的同一程序集中。 (出于匿名原因,我确实编辑了程序集/命名空间的名称)

鉴于此类在其他情况下有效的知识,我唯一的猜测是这可能是一个信任问题,但我在网上没有找到太多与此相关的信息。任何帮助将不胜感激。

这是 ReflectionHelper 类的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Runtime.Serialization;
using System.Web;

namespace MyCompanyName
{
[Serializable]
public class ReflectionHelper
{

public AppDomain appDomain { get; set; }
public byte[] PluginBytes { get; set; }
public string PluginClassName { get; set; }
public string PluginAssemblyName { get; set; }
public Dictionary<string, byte[]> AssemblyArchive { get; set; }

public object GetInstance(AppDomain NewDomain, byte[] PluginBytes, string PluginClassName, string PluginAssemblyName, Dictionary<string, byte[]> AssemblyArchive)
{
try
{
this.appDomain = NewDomain;
this.PluginBytes = PluginBytes;
this.PluginClassName = PluginClassName;
this.AssemblyArchive = AssemblyArchive;
this.PluginAssemblyName = PluginAssemblyName;

//this is the line that throws the serializationexception
appDomain.AssemblyResolve += new ResolveEventHandler((sender, args) =>
{
AssemblyName x = new AssemblyName(args.Name);
string Name = x.Name;
if (System.IO.Path.GetExtension(x.Name) != ".dll")
Name += ".dll";
Assembly Ret = appDomain.Load(this.AssemblyArchive[Name]);

return Ret;
});
appDomain.DoCallBack(LoaderCallBack);
return appDomain.GetData("Plugin");
}
catch (Exception ex)
{
throw ex;
}
}
public void LoaderCallBack()
{
ObjectHandle PluginObject = appDomain.CreateInstance(string.Format(this.PluginAssemblyName), PluginClassName);
appDomain.SetData("Plugin", PluginObject.Unwrap());
}
}


}

这是调用它的代码片段

AppDomain currentDomain = AppDomain.CurrentDomain;
AppDomainSetup domainSetup = new AppDomainSetup() { };
AppDomain BrokerJobDomain = AppDomain.CreateDomain("WorkerPluginDomain" + Guid.NewGuid().ToString());//, null, new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase });

ReflectionHelper helper = new ReflectionHelper();
object Instance = helper.GetInstance(BrokerJobDomain, pluginAssembly.PluginBytes, pluginAssembly.ClassName, pluginAssembly.AssemblyName, pluginAssembly.AssemblyArchive);
IWorkPlugin executor = (IWorkPlugin)Instance;

这是从云存储下载插件时填充的程序集信息类

public class PluginAssemblyInfo
{
public string ClassName { get; set; }
public byte[] PluginBytes { get; set; }
public Dictionary<string, byte[]> AssemblyArchive { get; set; }
public string AssemblyName { get; set; }
public DateTime LoadDate { get; set; }
}

最佳答案

该问题似乎与未在子域上设置relativesearchpath有关。确保子域具有相同的设置凭据似乎可以解决此问题。

AppDomain currentDomain = AppDomain.CurrentDomain;
AppDomain BrokerJobDomain = AppDomain.CreateDomain("WorkerPluginDomain" + Guid.NewGuid().ToString(), null, AppDomain.CurrentDomain.SetupInformation );

关于c# - 将程序集加载到 WindowsAzure WorkerRole 中的单独 AppDomain 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com