要实现这样的条件编译:Microsoft.Office.Interop.Excel存在与否。

jtdarsshj 2012-06-03 02:04:20
如果Microsoft.Office.Interop.Excel程序集引用存在,则编译函数A,不编译函数B;
如果Microsoft.Office.Interop.Excel程序集引用不存在,则编译函数B,不编译函数A;



函数A里,有一些excel操作。
函数B里,没有excel操作。
...全文
384 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
颤菊大师 2012-06-03
  • 打赏
  • 举报
回复
有一个东西叫反射。。。。。。
uhonor 2012-06-03
  • 打赏
  • 举报
回复
应该是判断是否安装了Execl,你可以适用第三方的空间如NPOI,可以不需要安装office
Conmajia 2012-06-03
  • 打赏
  • 举报
回复
从1楼看到27楼,突然觉得我智商好低啊。。这尼玛关wpf半毛钱的事啊。。
SocketUp 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 8 楼 的回复:

那就动态调用吧CoInitialize CoCreateInstance CoUninitialize

技术分0的话还是别去听了,完全是个新人,居然拿随便搜索的结果贴出来,那三个方法是C++下面使用的,和C#完全无关。
[/Quote]

原来技术还要和技术分挂钩啊
原来COM技术还要区分C++和C#
C#就不能用COM?C#就不能用API?
你真傻
jtdarsshj 2012-06-03
  • 打赏
  • 举报
回复
哈哈,好方法。

[Quote=引用 28 楼 的回复:]

在button_Click中你可以去处理刚刚创建的excel文档。而如果没有安装excel,那么你连button都不用给用户动态创建出来了!
[/Quote]
jtdarsshj 2012-06-03
  • 打赏
  • 举报
回复
谢谢啊。

不过,只是想问一个问题:你这个代码,必须在安装了office的机子上,编译吗?

如果机子没有安装office,这个代码是不是就不能被编译通过?


[Quote=引用 27 楼 的回复:]

我不管wpf,目前来说我没有找打wpf编程的必要理由。假设真的需要自己写驱动,我会使用c编写的驱动并且使用silverlgiht oob模式来调用。

以silverlgiht的oob模式来调用Excel,例如(随便写个例子)C# code
excel = AutomationFactory.CreateObject("Excel.Application");
if(excel==null……
[/Quote]
  • 打赏
  • 举报
回复
目前来说我没有找打wpf编程的必要理由 --> 目前来说我没有找到wpf编程的必要理由


我们的系统都使用网页形式、经过类似搜索引擎和广告系统的方式来推广。而安装为本地系统的silverlght应用程序又是自动到服务器上去更新的。因此我们的企业应用系统,从来不使用wpf开发。而是使用silverlight。
  • 打赏
  • 举报
回复
在button_Click中你可以去处理刚刚创建的excel文档。而如果没有安装excel,那么你连button都不用给用户动态创建出来了!
  • 打赏
  • 举报
回复
我不管wpf,目前来说我没有找打wpf编程的必要理由。假设真的需要自己写驱动,我会使用c编写的驱动并且使用silverlgiht oob模式来调用。

以silverlgiht的oob模式来调用Excel,例如(随便写个例子)
excel = AutomationFactory.CreateObject("Excel.Application");
if(excel==null)
throw new Exception("没有安装Excel。");

excel.Visible = true;
var workbook = excel.workbooks; workbook.Add();
sheet = excel.ActiveSheet;
var i = 1;
var data = new double[] { 1.0, 5.0, 9.5, 2.7, 3.2, 0.6 };
foreach (var d in data)
{
var cell = sheet.Cells[i, 1];
cell.Value = "第 " + i + "行";
cell.ColumnWidth = 10;
cell = sheet.Cells[i, 2];
cell.Value = d;
i++;
}
var button = new Button { Content = "click me!", Width = 80, Height = 20 };
this.Container.Children.Add(button);
button.Click += new RoutedEventHandler(button_Click);
CheckValues();
excel.DisplayAlerts = false;
excel.Quit();

那么运行时根据是否安装excel来调用不同的程序,很简答。
jtdarsshj 2012-06-03
  • 打赏
  • 举报
回复
呵呵,你说的有道理。

那么,如果采用条件调用的方法:

如果一台机子没有安装office,程序还是不能被编译通过啊,因为,我的程序里面,有操作excel的代码。


[Quote=引用 23 楼 的回复:]

不理你了,你真的是在无理取闹了,硬是要公鸡下蛋,怎么可能?条件调用有啥不好的?你附加一个源码到客户端去条件编译(运行时编译一段代码),是可以做到,但是那样效率更低,得不偿失。如果是明文源码,还泄漏了软件机密,甚至能被篡改。
[/Quote]
__天涯寻梦 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]
我明白你的意思了。

那我能不能写个脚本,先判断office是否被安装,然后用脚本控制:

如果有,则编译A.cs,不编译B.cs。
如果无,则编译B.cs,不编译A.cs。

是不是这个意思?



引用 21 楼 的回复:

引用 19 楼 的回复:
有点是这个意思吧。


其实,我要实现的,就是普通的条件编译啊。

只不过,这个条件是“机子上有没有安装o……
[/Quote]
这样可以
jtdarsshj 2012-06-03
  • 打赏
  • 举报
回复
我明白你的意思了。

那我能不能写个脚本,先判断office是否被安装,然后用脚本控制:

如果有,则编译A.cs,不编译B.cs。
如果无,则编译B.cs,不编译A.cs。

是不是这个意思?


[Quote=引用 21 楼 的回复:]

引用 19 楼 的回复:
有点是这个意思吧。


其实,我要实现的,就是普通的条件编译啊。

只不过,这个条件是“机子上有没有安装office”。




引用 15 楼 的回复:

引用 12 楼 的回复:
但是,我要实现的是“条件编译”啊。


我要实现的:只有一个函数被编译进去啊。该怎么做?



引用 10 楼 的回复:

引用 1 楼 的……
[/Quote]
qldsrx 2012-06-03
  • 打赏
  • 举报
回复
不理你了,你真的是在无理取闹了,硬是要公鸡下蛋,怎么可能?条件调用有啥不好的?你附加一个源码到客户端去条件编译(运行时编译一段代码),是可以做到,但是那样效率更低,得不偿失。如果是明文源码,还泄漏了软件机密,甚至能被篡改。
jtdarsshj 2012-06-03
  • 打赏
  • 举报
回复
呵呵。

不知道能不能实现呢?

我是想实现条件编译啊。

并不是想实现:条件调用。

你在7楼那个例子,好象只是条件调用吧?





[Quote=引用 17 楼 的回复:]

引用 8 楼 的回复:

那就动态调用吧CoInitialize CoCreateInstance CoUninitialize

技术分0的话还是别去听了,完全是个新人,居然拿随便搜索的结果贴出来,那三个方法是C++下面使用的,和C#完全无关。
[/Quote]
__天涯寻梦 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
有点是这个意思吧。


其实,我要实现的,就是普通的条件编译啊。

只不过,这个条件是“机子上有没有安装office”。




引用 15 楼 的回复:

引用 12 楼 的回复:
但是,我要实现的是“条件编译”啊。


我要实现的:只有一个函数被编译进去啊。该怎么做?



引用 10 楼 的回复:

引用 1 楼 的回复:
C# code
#d……
[/Quote]
预编译的时候编辑器不可能去调用什么方法来检测的,因为那时方法都还没被编译出来没法去执行,要么你手动检测下,要么你再写个小程序来检测,然后指定一个宏决定编译哪个。
iyomumx 2012-06-03
  • 打赏
  • 举报
回复
直接引用Microsoft.Office.Interop.Excel,参考
如何:通过主互操作程序集面向 Office 应用程序
不需要考虑用户机器上是否安装Excel,COM组件是运行时绑定的,如果判断用户机器上没有Excel,那么不执行操作Excel的代码即可,不会影响程序其它部分的运行。
jtdarsshj 2012-06-03
  • 打赏
  • 举报
回复
有点是这个意思吧。


其实,我要实现的,就是普通的条件编译啊。

只不过,这个条件是“机子上有没有安装office”。



[Quote=引用 15 楼 的回复:]

引用 12 楼 的回复:
但是,我要实现的是“条件编译”啊。


我要实现的:只有一个函数被编译进去啊。该怎么做?



引用 10 楼 的回复:

引用 1 楼 的回复:
C# code
#define A

#if A
public void A()
{
}

#else

public void B()
{
}

#endif

你这……
[/Quote]
qldsrx 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

你这个方法好象不行啊。
如果这台机子,没有安装office,函数A,能够被编译吗?

函数A里面,是有execel操作的啊。

[/Quote]
你是间接在访问COM组件,只要有那个Microsoft.Office.Interop.Excel的引用就可保正常,你还是自己去调试下吧,我口头上说了无数遍了,你还是不相信怎么办?我实际也有这样的程序放到服务器上运行的,而服务器没安装Office,都说到这个份上了,你还是不信怎么办?别人随便吐出几个不着边际的动态编译你就信了?你太没有识别能力了吧。
qldsrx 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

那就动态调用吧CoInitialize CoCreateInstance CoUninitialize
[/Quote]
技术分0的话还是别去听了,完全是个新人,居然拿随便搜索的结果贴出来,那三个方法是C++下面使用的,和C#完全无关。
jtdarsshj 2012-06-03
  • 打赏
  • 举报
回复
你这个方法好象不行啊。
如果这台机子,没有安装office,函数A,能够被编译吗?

函数A里面,是有execel操作的啊。

[Quote=引用 7 楼 的回复:]

注册表项在SOFTWARE\\Microsoft\\Office里面,参考自己本地的注册表信息。
另外还有更好的方法,参考如下代码:
C# code

bool isExcelInstalled()
{
Type type = Type.GetTypeFromProgID("Excel.Application");
return type !……
[/Quote]
加载更多回复(15)

111,126

社区成员

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

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

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