F# 从程序集中加载资源而不锁定dll文件

F# 从程序集中加载资源而不锁定dll文件,f#,.net-remoting,F#,.net Remoting,我正在尝试从程序集中加载资源,而不锁定dll文件 我正在尝试以下方法,这与我以前在C#中使用的方法类似: 类型IEmbeddedResourceReader= abstract ReadResource:ReferencedAssembly:string[]*asmName:string*resourceName:string->string选项 类型EmbeddedResourceReader()= 继承MarshalByRefObject() IEmbeddedResourceReader与

我正在尝试从程序集中加载资源,而不锁定dll文件

我正在尝试以下方法,这与我以前在C#中使用的方法类似:

类型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))