Dan*_*owy 7 c# f# office-interop
我有两个用C#编写的库,我想在F#应用程序中使用它.两个库都使用相同的类型,但是,我无法说服F#的类型检查这个事实.
这是使用Office互操作类型的简单示例.F#似乎对这些类型问题特别敏感.在F#方面施放似乎并没有帮助这种情况.所有三个项目都引用了相同的程序集("Microsoft.Office.Interop.Excel"版本14.0.0.0).
在项目"Project1"(C#项目)中:
namespace Project1
{
public class Class1
{
public static Microsoft.Office.Interop.Excel.Application GetApp()
{
return new Microsoft.Office.Interop.Excel.Application();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在项目"Project2"(C#项目)中:
namespace Project2
{
public class Class2
{
Microsoft.Office.Interop.Excel.Application _app;
public Class2(Microsoft.Office.Interop.Excel.Application app)
{
_app = app;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在项目"TestApp"(一个F#项目)中:
[<EntryPoint>]
let main argv =
let c2 = Project2.Class2(Project1.Class1.GetApp())
0
Run Code Online (Sandbox Code Playgroud)
任何提示?
编辑:
Class2使用以下动态转换更改对构造函数的调用可以解决问题:
let c2 = Project2.Class2(Project1.Class1.GetApp() :?> Microsoft.Office.Interop.Excel.Application)
Run Code Online (Sandbox Code Playgroud)
然而,这是不满意的,因为它是1)动态的,2)我仍然不明白为什么原始类型检查失败.
COM 互操作。当您引用 COM 程序集时,它实际上会生成一个 COM 互操作程序集以在 .NET 和 COM 之间进行编组。如果您有两个程序集都引用同一个 COM 程序集,那么您实际上可能有两个相同生成的互操作程序集。
一种解决方案(坦率地说,通常更好的设计)是在两个程序集之一(或共享的第三个程序集)中创建接口,这些接口公开您想要公开的功能,而不是使用或消耗 COM 类型,而是使用这些接口。
namespace Project1
{
public interface IApplication
{
// application members here...
}
public class Class1
{
public static IApplication GetApp()
{
return new ExcelApplication(new Microsoft.Office.Interop.Excel.Application());
}
private class ExcelApplication : IApplication
{
public ExcelApplication(Microsoft.Office.Interop.Excel.Application app)
{
this.app = app;
}
// implement IApplication here...
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |