用Assembly 调用到的dll文件后,这个文件就一直被占用,怎么解决?

Roior 2005-05-08 04:12:07
像如下代码, 如果程序中调用了这个函数,那么e:\Script.dll这个文件一直被占用着,请问如何释放这文件,使 e:\Script.dll这个文件能被修改或被删除呢?
有办法没有?
public string[] getScript(string[] Paras)
{
string[] script;
FileInfo file=new FileInfo(Path.Combine (Application.StartupPath,@"e:\Script.dll"));
if(file.Exists)
{
try
{
Assembly ass=Assembly.LoadFrom(file.FullName);
Type[] type=ass.GetTypes();
foreach(Type t in type)
{
if(t.Name=="ReportScript")
{
MethodInfo m=t.GetMethod("Run");
if(m!=null)
{
object o=Activator.CreateInstance(t);
script=(string[])m.Invoke(o,new object[]{Paras});
return script;
}
else
{
MessageBox.Show("装载出错!");
return null;
}
......
...全文
450 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Roior 2005-05-14
  • 打赏
  • 举报
回复
终于解决了,其实还是走了很多弯路,最开始就看了MSDN例子,只是没搞清楚先还是要引用一下要调用的dll。
后来又在参数传递上花了半天时间,原来自定义的类是要序列化的,还要定义序列化的构造函数了。
[Serializable]
public class RepParas : System.Collections.Hashtable
{

public RepParas() :base()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
protected RepParas(SerializationInfo si, StreamingContext context): base(si,context)
{

}
public override void GetObjectData(SerializationInfo si, StreamingContext context)
{
base.GetObjectData(si,context);
}

}
改写了参数后一切OK了,多谢tiaoci(我挑刺,我快乐) !!!!
kangfc 2005-05-11
  • 打赏
  • 举报
回复
up
tiaoci 2005-05-11
  • 打赏
  • 举报
回复
先用 AppDomain.Load("....\ReportScript.dll") 装载程序集

然后使用 Assembly.CreateInstance
tiaoci 2005-05-11
  • 打赏
  • 举报
回复
好像直接通过Load这样装载出来还不行,只能是

CreateInstanceFromAndWrap 这样,试试吧
tiaoci 2005-05-11
  • 打赏
  • 举报
回复
无穷麻烦啊,写了一个,也不知道有没有问题,

请把下面内容分别保存成不同的文件,

放到一个目录下,然后运行build.bat

--------------build.bat--------------
csc /t:library /out:Common.dll IAddin.cs
csc /t:library /r:Common.dll Addin.cs
csc /t:exe /r:Common.dll AppDemo.cs
AppDemo

--------------IAddin.cs--------------
public interface IAddin
{
void Execute();
}

--------------Addin.cs--------------
using System;

public class Addin : MarshalByRefObject, IAddin
{
public void Execute()
{
Console.WriteLine("Hello, world!");
}
}

--------------AppDemo.cs--------------
using System;
using System.IO;

public class Test
{
public static void Main(string [] args)
{
AppDomain domain = AppDomain.CreateDomain("addin");
object addin = domain.CreateInstanceFromAndUnwrap("Addin.dll", "Addin");
((IAddin)addin).Execute();
AppDomain.Unload(domain);
File.Delete("Addin.dll");
Console.WriteLine("Addin deleted!");
}
}

Roior 2005-05-11
  • 打赏
  • 举报
回复
tiaoci(我挑刺,我快乐), 帮我写一下嘛,我对这个一点都不熟,看了一些例子,没一个能运行的.多谢了啊。:)
Roior 2005-05-10
  • 打赏
  • 举报
回复
耽搁了一天,继续:)
是不是这样写呢:
ReportScript.dll是这样的
class ReportScript
{
public string[] Run(string[] Paras)
{
sring[] ss;
......
return ss;
}
}
下面是另一个程序调用的函数:
public string[] getScript(string[] Paras)
{
AppDomain d = AppDomain.CreateDomain("myDomain");
ObjectHandle obj=d.CreateInstance("ReportScript","myObject");
myObject myob=(myObject )obj.Unwrap();
return myob.Run(Paras);
}
可是出错啊!!!
编译时提示:找不到类型或命名空间名称"myObject",错在哪啊,我看微软件帮助也是这样写的
是不是ObjectHandle obj=d.CreateInstance("ReportScript","myObject");之前还要做
什么处理啊?多谢了

Roior 2005-05-09
  • 打赏
  • 举报
回复
多谢,我先去查查资料!
tiaoci 2005-05-09
  • 打赏
  • 举报
回复
这种东西说来话长,自己翻翻AppDomain的文档和MSDN中

Programming with Application Domains and Assemblies

这节的文章吧
tiaoci 2005-05-09
  • 打赏
  • 举报
回复
创建一个新的AppDomain,在那个新的AppDomain中运行Script.dll

运行完后把那个AppDomain unload 掉

然后就可以删除dll了
sky 2005-05-09
  • 打赏
  • 举报
回复
跟我一样的写法,友情关注
Roior 2005-05-09
  • 打赏
  • 举报
回复
程序调用后这个e:\Script.dll文件能删除吗,我的是删除不了的,只有退出这个程序才能删除这个dll文件
zealic 2005-05-09
  • 打赏
  • 举报
回复
动态加载程序集
不要直接引用
snowfox0318 2005-05-08
  • 打赏
  • 举报
回复
当Run这个过程运行结束,Assembly Script.dll就被自动释放了。不可能要求在这个dll还在运行的时候修改他。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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