我在这样的程序集中定义了一个接口:
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>