我在这样的程序集中定义了一个接口:

namespace HelloWorlder
{
    public interface IHelloWorld {
        string SayHello();
    }
}


在单独的程序集中,我有另一个类定义为:

using HelloWorlder;

public class HelloWorld : IHelloWorld {
    string IHelloWorld.SayHello() {
        return "Hello, world!";
    }
}


现在尝试从F#Interactive调用它,我得到一个无效的强制转换异常,这是尝试使用此DLL的代码:

#I __SOURCE_DIRECTORY__
#r "HelloWorlder.dll"

open System
open System.Reflection
open HelloWorlder




let asm = Assembly.LoadFrom(__SOURCE_DIRECTORY__ + "\\HelloWorld.dll")
let hwIns = asm.CreateInstance("HelloWorld") :?> IHelloWorld
let res = hwIns.SayHello()


从我所见,它应该起作用,作为额外的预防措施,您将看到我已明确实现接口IHelloWorld。我猜想我缺少一些东西,但是我无法弄清楚为什么它会抛出强制转换异常。

最佳答案

事实证明,我实际上必须取消对对象的装箱而不是对其进行强制转换,然后它才能正常工作。

let hwIns = asm.CreateInstance("HelloWorld") |> unbox<IHelloWorld>

10-06 07:10