如果Microsoft.Office.Interop.Excel程序集引用存在,则编译函数A,不编译函数B;
如果Microsoft.Office.Interop.Excel程序集引用不存在,则编译函数B,不编译函数A;函数A里,有一些excel操作。
函数B里,没有excel操作。

解决方案 »

  1.   

    #define A#if A
            public void A()
            {
            }#else        public void B()
            {
            }#endif
      

  2.   

    我知道可以用define,但是,怎么知道有没有Microsoft.Office.Interop.Excel?
      

  3.   

    那个dll只要直接复制即可,无视版本的,而且如果不直接复制将会出现版本异常,必须复制过去,那个dll并非com组件,而是.NET组件,封装了com调用方法而已,所以你安装的版本和对方不一致的时候,不复制过去将会提示出错。
      

  4.   

    你的问题不应该是判断Microsoft.Office.Interop.Excel是否存在,而必须判断对方是否安装Excel,判断一个.NET的Dll是否存在毫无意义,不存在复制过去即可(必须复制,确保版本一致),也就是编译项目的时候,将那个dll复制到本地。
    至于判断对方是否安装Excel,只要判断注册表项即可,即使没有安装Excel,引用那个Microsoft.Office.Interop.Excel的项目依然正常工作,只要不执行到对应的方法,执行对应的方法前,判断下注册表的Offiec安装信息即可。
      

  5.   

    注册表项在SOFTWARE\\Microsoft\\Office里面,参考自己本地的注册表信息。
    另外还有更好的方法,参考如下代码:    bool isExcelInstalled()
        {
            Type type = Type.GetTypeFromProgID("Excel.Application");
            return type != null;
        }总之那个Microsoft.Office.Interop.Excel你只管带到客户端即可,免得客户端安装的Office版本和你的不一样,找不到同版本的Microsoft.Office.Interop.Excel.dll而报错。
      

  6.   

    那就动态调用吧CoInitialize CoCreateInstance CoUninitialize
      

  7.   

    不需要判断注册表,使用的时候直接创建对象,如果没有安装Excel会抛出COMException,提示COM组件无法找到。捕获这个错误就能判断是否安装了Excel。
      

  8.   

    难道说你是给用户源码,到用户的电脑上面进行条件编译?在本机编译的时候,怎么知道你所给的用户电脑是否安装Excel?
    如果说你不需要判断用户是否安装了Excel,那么直接自己定义一个#define A不也一样吗?第一次编译#define A,第二次编译删除#define A,这样就得到了两个版本了。
      

  9.   

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

  10.   

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

  11.   

    有点是这个意思吧。
    其实,我要实现的,就是普通的条件编译啊。只不过,这个条件是“机子上有没有安装office”。
      

  12.   

    直接引用Microsoft.Office.Interop.Excel,参考
    如何:通过主互操作程序集面向 Office 应用程序
    不需要考虑用户机器上是否安装Excel,COM组件是运行时绑定的,如果判断用户机器上没有Excel,那么不执行操作Excel的代码即可,不会影响程序其它部分的运行。
      

  13.   

    我明白你的意思了。那我能不能写个脚本,先判断office是否被安装,然后用脚本控制:如果有,则编译A.cs,不编译B.cs。
    如果无,则编译B.cs,不编译A.cs。是不是这个意思?
      

  14.   

    呵呵,你说的有道理。那么,如果采用条件调用的方法:如果一台机子没有安装office,程序还是不能被编译通过啊,因为,我的程序里面,有操作excel的代码。
      

  15.   

    我不管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来调用不同的程序,很简答。
      

  16.   

    在button_Click中你可以去处理刚刚创建的excel文档。而如果没有安装excel,那么你连button都不用给用户动态创建出来了!
      

  17.   

    目前来说我没有找打wpf编程的必要理由   -->  目前来说我没有找到wpf编程的必要理由
    我们的系统都使用网页形式、经过类似搜索引擎和广告系统的方式来推广。而安装为本地系统的silverlght应用程序又是自动到服务器上去更新的。因此我们的企业应用系统,从来不使用wpf开发。而是使用silverlight。
      

  18.   

    谢谢啊。不过,只是想问一个问题:你这个代码,必须在安装了office的机子上,编译吗?如果机子没有安装office,这个代码是不是就不能被编译通过?
      

  19.   


    原来技术还要和技术分挂钩啊
    原来COM技术还要区分C++和C#
    C#就不能用COM?C#就不能用API?
    你真傻
      

  20.   

    从1楼看到27楼,突然觉得我智商好低啊。。这尼玛关wpf半毛钱的事啊。。
      

  21.   

    应该是判断是否安装了Execl,你可以适用第三方的空间如NPOI,可以不需要安装office