动态转换为接口时出现 InvalidCastException

InvalidCastException when casting dynamically to interface

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

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

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

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>