我有一个用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时,消息"无法添加对指定文件的引用".被扔了.
任何人都可以指出我正确的方向为什么/如何让这个工作?
提前谢谢!
(从帖子中得到一些后续内容(仍然没有答案):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#或.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 3.5应用程序,并且需要在服务器上评估JS代码 - 基本上是用户提供的规则集,可以在浏览器或服务器上运行.托管JS不是一个选项,因为JS代码将在运行时提供.Aptana的Jaxer也不是一个选择.所以我正在研究在我的应用程序中使用V8引擎的构建.
我成功地将源代码构建到DLL中,但该DLL不是托管库,也不是COM.V8只是普通的C++.
关于如何在C#中与这种类型的DLL互操作的任何想法?另外,我对SpiderMonkey或其他JS引擎的其他建议持开放态度.
提前致谢.
更新:
我能够使用Ryan的解决方案.我刚刚更新了对trunk的最新版本的引用.它运作得很好.谢谢瑞恩.
我需要使用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?
我正在学习Scala,我有一个Java项目要迁移到Scala.我想通过逐个重写类并检查新类没有破坏项目来迁移它.
这个Java项目使用了很多java.util.List
和java.util.Map
.在新的Scala类中,我想使用Scala List
并Map
拥有漂亮的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) 我知道基本的区别,因为ReleaseComObject
只减少一些计数器并将其FinalReleaseComObject
减少到零.
所以我通常听到的是,调用FinalReleaseComObject
因为那时你确定COM对象真的被释放了.
但这让我想知道,这个反击有一点对吗?如果你总是打电话,你不打破这种机制吗FinalReleaseComObject
?如果在您打电话之前该计数器不是一个,那么ReleaseComObject
可能没有理由吗?
什么可能导致它高于一个不应该?
提前致谢.
PS:我的COM体验只包括使用Excel Interop.不确定这个问题是否属于该域的本地问题(即在Office Interop之外,FinalReleaseComObject
不经常使用).
该文章丹提及使用会谈ReleaseComObject
时,即可大功告成.据我从文章中了解,这是正常的方式.我认为,如果你这样做,它应该工作正常.在对文章的评论中,作者建议有人ReleaseComObject
在循环中调用直到它真正发布(该文章来自2006年,所以这与调用类似FinalReleaseComObject
).但他也表示这可能是危险的.
如果你真的想让RCW在代码中的某个特定点调用Release(),你可以在循环中调用ReleaseComObject()直到返回值达到零.这应该确保RCW将调用Release().但是,如果您这样做,请注意,当其他托管引用尝试使用该RCW时,它将导致异常."
这让我相信总是打电话确实不是一个好主意FinalReleaseComObject
,因为你可以在其他地方引起例外.正如我现在所看到的那样,如果你绝对确定可以,你应该只打电话给你.
不过,我对此事的经验不多.我不知道怎么可以肯定.如果计数器在不应该增加的情况下增加,那么解决这个问题是不是更好?如果是这样,那么我会说FinalReleaseComObject
更多的是黑客而不是最佳实践.
我正在开发一个应用程序,它需要大量的stastical处理和输出作为.net桌面应用程序中的图像.这些问题,包括生成输出图像,似乎很适合R http://www.r-project.org/
是否有允许我从.net调用R的包装器,API,SDK或端口?
我试图使用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) 我有一个WPF窗口,其中包含一个WindowsFormsHost
元素.我需要在这个元素之上绘制东西,但是WindowsFormsHost
它的本质意味着它始终位于绘图堆的顶部.由于我无法在WindowsFormsHost
组件顶部的同一个WPF窗口中绘制,我可以在其上覆盖另一个窗口吗?
我已经初步尝试了这个,但是我遇到了一些问题:
1)我无法阻止主窗口和覆盖窗口之间的其他应用程序的窗口.
2)当我按Alt-Tab时,覆盖窗口出现在窗口列表中,这非常难看.
基本上我需要一个"子窗口"的概念,并且所有意图和目的的窗口都显示为另一个窗口的一部分.UserControls对我来说不起作用,因为它总是WindowsFormsHost
会在它上面绘制.
有任何想法吗?
更新[2011年5月23日10:13]
谢谢你们的回答.
我已经尝试过这种ChildWindow
方法,而且WindowsFormsHost
元素仍然是最重要的.据我了解,只有一个真正的窗口可以在a上面绘制WindowsFormsHost
,同一个窗口中的任何东西都会在下面WindowsFormsHost
.
用的元素WindowsFormsHost
仍然会在一个WinForms组件画,他们总是画在上面,这似乎非流通...
我想我正在寻找的是一种方法来停靠外部窗口作为主窗口的一部分.在Mac上,有一个真正的"儿童窗口"的概念,我正在寻找类似的东西.