F# 从程序集中加载资源而不锁定dll文件
我正在尝试从程序集中加载资源,而不锁定dll文件 我正在尝试以下方法,这与我以前在C#中使用的方法类似:F# 从程序集中加载资源而不锁定dll文件,f#,.net-remoting,F#,.net Remoting,我正在尝试从程序集中加载资源,而不锁定dll文件 我正在尝试以下方法,这与我以前在C#中使用的方法类似: 类型IEmbeddedResourceReader= abstract ReadResource:ReferencedAssembly:string[]*asmName:string*resourceName:string->string选项 类型EmbeddedResourceReader()= 继承MarshalByRefObject() IEmbeddedResourceReader与
类型IEmbeddedResourceReader=
abstract ReadResource:ReferencedAssembly:string[]*asmName:string*resourceName:string->string选项
类型EmbeddedResourceReader()=
继承MarshalByRefObject()
IEmbeddedResourceReader与的接口
成员_uu.ReadResource(引用程序集、asmName、resourceName)=
尝试
设asmLocation=
引用的程序集
|>Array.tryFind(fun(x:string)->x.EndsWith(asmName+“.dll”,StringComparison.InvariantCultureIgnoreCase))
设asm=
匹配位置
|某些asmLocation->Assembly.LoadFrom asmLocation
|无->汇编.Load(asmName)
使用sr=newstreamreader(asm.GetManifestResourceStream(resourceName))
一些(sr.ReadToEnd())
与u->
没有一个
静态成员ReadResource(ReferencedAssembly,resourceName:string)=
将resourceName.Split(',')与匹配
|[| asmName;name |]->
让domain=AppDomain.CreateDomain“嵌入式资源读取器”
尝试
让reader=domain.CreateInstanceFromAndUnwrap(Assembly.getExecutionGassembly().Location,
typeof.FullName):?>IEmbeddedResourceReader
reader.ReadResource(引用程序集,asmName.Trim(),name.Trim())
最后
AppDomain.Unload域
|无
但我得到一个InvalidCastException(无法将透明代理强制转换为类型“IEmbeddedResourceReader”。)
我做错了什么?原来我需要添加以下内容才能使其正常工作:
static do
AppDomain.CurrentDomain.add_AssemblyResolve(ResolveEventHandler(fun _ args ->
if args.Name = typeof<IEmbeddedResourceReader>.Assembly.FullName then
typeof<IEmbeddedResourceReader>.Assembly
else
null))
静态do
AppDomain.CurrentDomain.add_AssemblyResolve(ResolveEventHandler)(有趣的参数->
如果args.Name=typeof.Assembly.FullName,则
装配类型
其他的
空)
感谢@mitekm(Dmitry Morozov)的回答
不幸的是,dll不再被锁定,但xml和pdb文件仍被VS锁定:/
static do
AppDomain.CurrentDomain.add_AssemblyResolve(ResolveEventHandler(fun _ args ->
if args.Name = typeof<IEmbeddedResourceReader>.Assembly.FullName then
typeof<IEmbeddedResourceReader>.Assembly
else
null))