一个设计问题,请教大家

yiming0755 2009-04-24 11:00:21
目前做的程序需要和一个PCI板集成.
这个板公开了3个方法DataOut() DataIn() ReadBack().
可以调用.
因为程序集是一个OCK文件,并且无法引用到项目中,所以只能这样用:
[DllImport("pci16pr.frm")]
public static extern int DataIn();

(不知道这样写大家看明白了没有)

下面有这样的问题出现:
考虑到以后程序可能会使用到其他的板,因为每块板公开的方法都是不一样的,所以这个地方需要做抽象.
但是static extern的方法,无法申明为虚方法,也无法写进InterFace里,那么该怎么做才能保证以后的扩展性呢?
...全文
124 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiming0755 2009-05-04
  • 打赏
  • 举报
回复
问题解决,给分
yiming0755 2009-04-24
  • 打赏
  • 举报
回复
动态调用非托管代码,听起来好象行,但是,怎么写,能给个例子吗,一楼.
yiming0755 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zgke 的回复:]
1 使用接口.. 把 [DllImport("pci16pr.frm")] 写些东西写到具体实现类里.然后在实现接口里调用

2 动态调用 非托管代码.
[/Quote]

问题是静态的方法无法实现接口成员,所以用接口一定不行.
vrhero 2009-04-24
  • 打赏
  • 举报
回复
google 适配器模式...
zgke 2009-04-24
  • 打赏
  • 举报
回复
1 使用接口.. 把 [DllImport("pci16pr.frm")] 写些东西写到具体实现类里.然后在实现接口里调用

2 动态调用 非托管代码.
birdlonger 2009-04-24
  • 打赏
  • 举报
回复
1,定义抽象接口规范. (抽象统一不同型号板子,方便程序同意调用)
interface Ipci
{
int DataOut();
int DataIn();
void ReadBack();
}
//具体板子对应DLL提供的函数.
class pcidll
{
[DllImport("pci16pr.frm")]
public static extern int DataIn();
[DllImport("pci16pr.frm")]
public static extern int DataOut();
[DllImport("pci16pr.frm")]
public static extern void ReadBack();
}
//实现接口
public class pci16:Ipci
{
public int DataIn()
{
pcidll.DataIn();
}
public int DataOut()
{
pcidll.DataOut();
}
public void ReadBack()
{
pcidll.ReadBack();
}
}

比如还有别的板子 pci12 ,pci14();等.
使用时:Ipci actualpci = new pci16(); //Icpi actualpci = new pci12(); //Icpi actualpci = new pci14();
这时就可以不用考虑具体是那个板子,统一调用下面来实现.
actualpci.DataIn(); actualpci.DataOut(); actualpci.ReadBack();
zgke 2009-04-24
  • 打赏
  • 举报
回复
vrhero 2009-04-24
  • 打赏
  • 举报
回复
lz没能理解1楼的意思...1、5、6楼都是一个意思...适配器模式...
zgke 2009-04-24
  • 打赏
  • 举报
回复
interface TestInterFace
{
int Dll_DataIn();
}

public class TestObject :TestInterFace
{
[DllImport("pci16pr.frm")]
public static extern int DataIn();
public int Dll_DataIn()
{
return DataIn();
}

}
这样不行???
daironghua 2009-04-24
  • 打赏
  • 举报
回复

1、先定义板卡的公共接口:
interface IPciBoard
{
int DateIN();
int DataOut();
void ReadBack();
}

2、假设要支持某类型板卡 PciA
class PciA:IPciBoard
{

int DateIN()

Api_DataIn();


//不同板卡API调用可写这里
[DllImport("pci16pr.frm")]
public static extern int Api_DataIn();
}


111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧