在新建立的AppDomain中动态加载Assembly的问题

Miracle 2004-10-26 01:42:02
我写的代码如下:
public static void CallDataPassFromAssembly(string assemblyName, DataSet data, Guid itemID)
{
FileInfo fi = new FileInfo(assemblyName);

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = fi.DirectoryName
setup.PrivateBinPath = ";bin";
setup.ApplicationName = "Dynamic Caller";
setup.ShadowCopyFiles = "true";

setup.LoaderOptimization = LoaderOptimization.SingleDomain;

System.Security.Policy.Evidence adevidence = AppDomain.CurrentDomain.Evidence;

AppDomain appDomain = AppDomain.CreateDomain("Bullseye DataPass Dynamic Caller", adevidence, setup);
try
{

Assembly asm = appDomain.Load(fi.Name.Replace(fi.Extension, ""));
Type custType = asm.GetType(DataPassResourceManager.CustomizeClassName);

object[] args = new object[]{data, itemID};

DataPassBase dpb = (DataPassBase)Activator.CreateInstance(custType, args);

dpb.CallDataPass();

}
finally
{
AppDomain.Unload(appDomain);
}

}
...全文
292 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leisang 2004-11-05
  • 打赏
  • 举报
回复
呵呵,不错,我也学习了
Miracle 2004-10-31
  • 打赏
  • 举报
回复
好了,自己彻底搞定了,在
|- AppDomain Base DIR
|- Bin
| |- DataPassBase.dll
|- DynaGen
| |- MyDataPass.dll
情况下,要设置AppDomain.BaseDirectory为共有的根目录(AppDomain Base DIR),然后将Bin和DynaGen目录设置为PrivateBinPath。需要注意的是PrivateBinPath必须是BaseDirectory的子目录,而且要使用相对路径。多个PrivateBinPath要用分号分隔,如"Bin;DynaGen"。
leisang 2004-10-27
  • 打赏
  • 举报
回复
寒~~自己都搞定了
把他们全放在一个目录下就可以了...
Miracle 2004-10-27
  • 打赏
  • 举报
回复
谢谢,我明白都放一个目录下就没问题,现在是想知道不在一个目录下有无办法设置CLR的程序集搜索路径。

在这个问题得到明确答案之前,我现在暂时每次都即时编译源代码到内存中然后就地加载,这种情况下一点问题都没有,不管引用程序集在哪里都没问难题。
Miracle 2004-10-26
  • 打赏
  • 举报
回复
找到答案了,AppDomain.Load()不能跨AppDomain调用。

我换用ad.CreateInstanceAndUnwrap()以后就可以正确的跨AppDomain创建和激活动态加载的对象了。需要注意对象只能是从MarshalByRefObject继承的。

不过除此之外现在仍然有问题。我的应用程序文件分布如下:
|- AppDomain Base DIR
|- Bin
| |- DataPassBase.dll
|- DynaGen
| |- MyDataPass.dll

MyDataPass.dll引用了DataPass.dll。这样的话我创建了子AppDomain,并且动态加载MyDataPass.dll的时候,就需要让CLR知道应该到哪里去搜索DataPassBase.dll。现在我无论如何都找不到如何设置搜索路径(除非把DataPassBase.dll复制到与MyDataPass.dll同一路径下,或者复制到其子目录中并设置新的PrivateBinPath)。

请问哪位有办法在上图所示的分布方式下进行文件定位?
Miracle 2004-10-26
  • 打赏
  • 举报
回复
不好意思,刚才写错了,错误提示应该是
Insufficient state to deserialize the object. More information is needed.

如果Assembly asm = appDomain.Load(fi.Name.Replace(fi.Extension, ""));
换成Assembly asm = appDomain.Load(assemblyName);才会出现上面的错误。
Miracle 2004-10-26
  • 打赏
  • 举报
回复
目的是为了在新创建的域中加载一个Assembly(之所以新建一个域,是因为不想造成被加载的Assembly被占用而无法用新版本覆盖)。

但是运行到Assembly asm = appDomain.Load(fi.Name.Replace(fi.Extension, ""));
就总是提示类似这样的错误:
File or assembly name c:\inetpub\wwwroot\DataPassPOC\Generated\DataPass.dll, or one of its dependencies, was not found.
其中“c:\inetpub\wwwroot\DataPassPOC\Generated\DataPass.dll”就是要加载的Assembly。

这个Assembly引用了System.dll, System.Web.dll, System.Data.Dll, 还有一个在c:\inetpub\wwwroot\DataPassPOC\Bin\下的DataPassBase.dll。

要怎么做才挣正确的加载这个Assembly呢?

各位大侠出手相助!孟子,思归,帮忙啊!

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧