标签: interop

一个简单的C#DLL - 如何从Excel,Access,VBA,VB6中调用它?

我有一个用c#编写的简单类库.

using System;
namespace TestDll
{
    public class Test
    {
        public string HelloWorld
        {
            get
            {
                return "Hello World";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何从Microsoft Office Visual Basic(我认为是VB6)调用此HelloWorld函数?

我的第一步是添加DLL作为参考 - 但在浏览和选择编译的DLL时,消息"无法添加对指定文件的引用".被扔了.

任何人都可以指出我正确的方向为什么/如何让这个工作?

提前谢谢!

c# vb6 dll excel interop

38
推荐指数
3
解决办法
6万
查看次数

处置Microsoft.Office.Interop.Word.Application

(从帖子中得到一些后续内容(仍然没有答案):https://stackoverflow.com/q/6197829/314661)

使用以下代码

Application app = new Application();
_Document doc = app.Documents.Open("myDocPath.docx", false, false, false);
doc.PrintOut(false);
doc.Close();
Run Code Online (Sandbox Code Playgroud)

我试图以编程方式打开并打印文件.

问题是每次运行上面的代码时都会启动一个新的WINWORD.exe进程,很明显这会很快占用所有内存.

应用程序类似乎不包含dispose/close或类似方法.

经过一番研究后我(实现了)并将代码更改为以下内容.

 Application app = new Application();
 _Document doc = app.Documents.Open(fullFilePath + ".doc", false, false, false);
 doc.PrintOut(false);
 doc.Close();
 int res = System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);
 int res1 = System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
Run Code Online (Sandbox Code Playgroud)

我可以看到剩余的引用计数为零,但过程仍然存在?

PS:我正在使用Microsoft.Office.Interop库的第14版.

c# automation interop office-interop

37
推荐指数
4
解决办法
7万
查看次数

向IntPtr添加偏移量

我正在寻找一种在C#或.NET中执行指针操作的方法.

我想做一些非常简单的事情

有一个指针IntPtr我想获得指向前2个字节的IntPtr对象.

我读了一些帖子,说这个愚蠢的片段会起作用......

IntPtr ptr = new IntPtr(oldptr.ToInt32() + 2);
Run Code Online (Sandbox Code Playgroud)

但我怀疑这个语句是否也适用于64位机器(因为在那里寻址是64位).

我发现这种优雅的方法来添加偏移量,但不幸的是只在.NET 4.0中http://msdn.microsoft.com/en-us/library/system.intptr.add%28VS.100%29.aspx

.net c# pinvoke interop

36
推荐指数
5
解决办法
2万
查看次数

从.NET应用程序引用Google的V8引擎

我正在构建一个.NET 3.5应用程序,并且需要在服务器上评估JS代码 - 基本上是用户提供的规则集,可以在浏览器或服务器上运行.托管JS不是一个选项,因为JS代码将在运行时提供.Aptana的Jaxer也不是一个选择.所以我正在研究在我的应用程序中使用V8引擎的构建.

我成功地将源代码构建到DLL中,但该DLL不是托管库,也不是COM.V8只是普通的C++.

关于如何在C#中与这种类型的DLL互操作的任何想法?另外,我对SpiderMonkey或其他JS引擎的其他建议持开放态度.

提前致谢.

更新:

我能够使用Ryan的解决方案.我刚刚更新了对trunk的最新版本的引用.它运作得很好.谢谢瑞恩.

.net javascript interop v8 serverside-javascript

35
推荐指数
3
解决办法
2万
查看次数

处理F#中的空值

我需要使用F#与一些C#代码互操作.Null是一个可能的值,因此我需要检查该值是否为null.文档建议使用模式匹配:

match value with
| null -> ...
| _ -> ...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是原始代码是用C#编写的:

if ( value != null ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如何在F#中进行等效操作?模式匹配是否存在无操作?有没有办法用if语句检查null?

c# null f# interop

34
推荐指数
3
解决办法
2万
查看次数

Java < - > Scala interop:透明的List和Map转换

我正在学习Scala,我有一个Java项目要迁移到Scala.我想通过逐个重写类并检查新类没有破坏项目来迁移它.

这个Java项目使用了很多java.util.Listjava.util.Map.在新的Scala类中,我想使用Scala ListMap拥有漂亮的Scala代码.

问题是新的类(那些在Scala中是wtitten)没有与现有的Java代码无缝集成:Java需要java.util.List,Scala需要它自己的代码scala.List.

以下是该问题的简化示例.有Main,Logic,Dao类.他们互相称呼:Main - > Logic - > Dao.

public class Main {
    public void a() {
        List<Integer> res = new Logic().calculate(Arrays.asList(1, 2, 3, 4, 5));
    }
}

public class Logic {
    public List<Integer> calculate(List<Integer> ints) {
        List<Integer> together = new Dao().getSomeInts();
        together.addAll(ints);
        return together;
    }
}

public class Dao {
    public List<Integer> getSomeInts() {
        return Arrays.asList(1, 2, 3); …
Run Code Online (Sandbox Code Playgroud)

java interop scala scala-java-interop

33
推荐指数
1
解决办法
1万
查看次数

为什么使用FinalReleaseComObject而不是ReleaseComObject?

我知道基本的区别,因为ReleaseComObject只减少一些计数器并将其FinalReleaseComObject减少到零.

所以我通常听到的是,调用FinalReleaseComObject因为那时你确定COM对象真的被释放了.

但这让我想知道,这个反击有一点对吗?如果你总是打电话,你不打破这种机制吗FinalReleaseComObject?如果在您打电话之前该计数器不是一个,那么ReleaseComObject可能没有理由吗?

什么可能导致它高于一个不应该?

提前致谢.

PS:我的COM体验只包括使用Excel Interop.不确定这个问题是否属于该域的本地问题(即在Office Interop之外,FinalReleaseComObject不经常使用).

更新1

文章丹提及使用会谈ReleaseComObject时,即可大功告成.据我从文章中了解,这是正常的方式.我认为,如果你这样做,它应该工作正常.在对文章的评论中,作者建议有人ReleaseComObject在循环中调用直到它真正发布(该文章来自2006年,所以这与调用类似FinalReleaseComObject).但他也表示这可能是危险的.

如果你真的想让RCW在代码中的某个特定点调用Release(),你可以在循环中调用ReleaseComObject()直到返回值达到零.这应该确保RCW将调用Release().但是,如果您这样做,请注意,当其他托管引用尝试使用该RCW时,它将导致异常."

这让我相信总是打电话确实不是一个好主意FinalReleaseComObject,因为你可以在其他地方引起例外.正如我现在所看到的那样,如果你绝对确定可以,你应该只打电话给你.

不过,我对此事的经验不多.我不知道怎么可以肯定.如果计数器在不应该增加的情况下增加,那么解决这个问题是不是更好?如果是这样,那么我会说FinalReleaseComObject更多的是黑客而不是最佳实践.

.net com interop

33
推荐指数
1
解决办法
2万
查看次数

从.net调用R(编程语言)

我正在开发一个应用程序,它需要大量的stastical处理和输出作为.net桌面应用程序中的图像.这些问题,包括生成输出图像,似乎很适合R http://www.r-project.org/

是否有允许我从.net调用R的包装器,API,SDK或端口?

.net statistics compatibility interop r

33
推荐指数
2
解决办法
3万
查看次数

服务器执行失败(来自HRESULT的异常:0x80080005(CO_E_SERVER_EXEC_FAILURE))

我试图使用Microsoft.Office.Interop.Excel.Workbook类将.xls文件转换为服务器端的.xlsx文件,如下所示:

 workBook.SaveAs("FILENAME_HERE", XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). : System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
   at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
   at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType)
   at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, …
Run Code Online (Sandbox Code Playgroud)

c# excel interop xls excel-interop

30
推荐指数
4
解决办法
7万
查看次数

我可以将WPF窗口覆盖在另一个窗口之上吗?

我有一个WPF窗口,其中包含一个WindowsFormsHost元素.我需要在这个元素之上绘制东西,但是WindowsFormsHost它的本质意味着它始终位于绘图堆的顶部.由于我无法在WindowsFormsHost组件顶部的同一个WPF窗口中绘制,我可以在其上覆盖另一个窗口吗?

我已经初步尝试了这个,但是我遇到了一些问题:

1)我无法阻止主窗口和覆盖窗口之间的其他应用程序的窗口.

2)当我按Alt-Tab时,覆盖窗口出现在窗口列表中,这非常难看.

基本上我需要一个"子窗口"的概念,并且所有意图和目的的窗口都显示为另一个窗口的一部分.UserControls对我来说不起作用,因为它总是WindowsFormsHost会在它上面绘制.

有任何想法吗?


更新[2011年5月23日10:13]

谢谢你们的回答.

我已经尝试过这种ChildWindow方法,而且WindowsFormsHost元素仍然是最重要的.据我了解,只有一个真正的窗口可以在a上面绘制WindowsFormsHost,同一个窗口中的任何东西都会在下面WindowsFormsHost.

用的元素WindowsFormsHost仍然会在一个WinForms组件画,他们总是画在上面,这似乎非流通...

我想我正在寻找的是一种方法来停靠外部窗口作为主窗口的一部分.在Mac上,有一个真正的"儿童窗口"的概念,我正在寻找类似的东西.

.net wpf interop windowsformshost

29
推荐指数
2
解决办法
2万
查看次数