我在C#(ApplicationClass
)中使用Excel互操作,并在我的finally子句中放置了以下代码:
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
虽然这种工作,Excel.exe
即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.
我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?
我使用C#.NET开发了一个Windows服务来生成PDF报告.要生成PDF文件,我使用的是第三方dll.该应用程序在我的Windows XP平台上运行.当我在Windows Server 2008 64位版本中部署该服务时,我收到此错误:
由于以下错误,检索具有CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}的组件的COM类工厂失败:80040154.
我使用regsvr32命令注册了DLL.我能够在注册表中看到这个CLSID.但问题仍然存在.
可能是什么问题呢?
在.NET透视图中:
这两个选项之间的真正区别是什么?我所知道的是:
注册COM Interop
此选项在程序集上执行regasm,并将程序集注册为注册表中的COM组件(或者可能不是),所有COM类似注册表项.此步骤是否生成TLB文件?还做了什么?
有时我看到在编译项目时会生成tlb但有时不会,这是为什么?
使装配COM可见
这个装配对装配有什么影响?如果我在这个程序集中有以下类型,即使我的类型被标记为ComVisible,我仍然需要指定"使程序集COM可见"吗?
[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)]
public interface IMyInterface
{
}
Run Code Online (Sandbox Code Playgroud) 如何将C#DLL转换为可由VB6应用程序使用的COM互操作DLL?
我从两个不同的第三方COM DLL创建了两个.NET Interop程序集.两个COM DLL都包含一个名为的类型COMMONTYPE
.因此,COMMONTYPE
现在也通过两个Interop组件暴露.
我有第三个需要使用这两个Interop程序集的项目,我得到了臭名昭着的编译时错误:
该类型
<ABC>
存在于<ASSEMBLY1.dll>
和<ASSEMBLY2.dll>
由于COM DLL是由第三方供应商提供的,因此我无法访问源代码,而且我正在编写一个C#Console应用程序,这意味着我没有web.config文件,我可以在其中添加debug=false
解决方法.我能做什么?
VS项目选项"注册COM互操作"到底是做什么的?因为当我使用此选项构建我的库时,我可以从VBScript上调用我的库中的CreateObject.但如果我没有这个构建然后手动运行regasm CreateObject失败.所以我想知道 - VS2010做了什么,我没做什么?
我正在尝试在C#中构建一个小应用程序,它应该启动/停止IIS Express工作进程.为此,我想使用MSDN上记录的官方"IIS Express API":http://msdn.microsoft.com/en-us/library/gg418415.aspx
据我所知,API仅(仅)基于COM接口.为了使用这个COM接口,我通过Add Reference - > COM - >"IIS Installed Versions Manager Interface"在VS2010中添加了对COM库的引用:
到目前为止一切都很好,但下一步是什么?有一个IIISExprProcessUtility
可用的接口,包括启动/停止IIS进程的两个"方法".我是否必须编写一个实现此接口的类?
public class test : IISVersionManagerLibrary.IIISExprProcessUtility
{
public string ConstructCommandLine(string bstrSite, string bstrApplication, string bstrApplicationPool, string bstrConfigPath)
{
throw new NotImplementedException();
}
public uint GetRunningProcessForSite(string bstrSite, string bstrApplication, string bstrApplicationPool, string bstrConfigPath)
{
throw new NotImplementedException();
}
public void StopProcess(uint dwPid)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我不是一名专业开发人员.有人能指出我正确的方向.任何帮助是极大的赞赏.
更新1: 根据建议,我尝试了下面的代码,但遗憾的是它不起作用:
好的,它可以实例化但我看不到如何使用这个对象...
IISVersionManagerLibrary.IIISExpressProcessUtility test3 = (IISVersionManagerLibrary.IIISExpressProcessUtility) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("5A081F08-E4FA-45CC-A8EA-5C8A7B51727C")));
Exception: Retrieving the …
Run Code Online (Sandbox Code Playgroud) 我想知道从打开的Excel工作簿读取和写入数据到c#对象的最快方法是什么.背景是我想开发从Excel使用的ac#应用程序并使用excel中保存的数据.
业务逻辑将驻留在c#应用程序中,但数据将驻留在Excel工作簿中.用户将使用Excel并在Excel工作簿上单击按钮(或执行类似操作)以启动c#应用程序.然后,c#应用程序将从excel工作簿中读取数据,处理数据,然后将数据写回excel工作簿.
可能需要读取大量数据块并将其写回excel工作簿,但它们通常具有相对较小的大小,例如10行和20列.有时可能需要处理大量数据,大约50,000行和40列.
我知道使用VSTO说这是相对容易的,但我想知道最快(但仍然健壮和优雅)的解决方案是什么,并了解速度.我不介意解决方案是否建议使用第三方产品或使用C++.
显而易见的解决方案是使用VSTO或互操作,但我不知道与我目前用于读取数据的VBA或者是否有任何其他解决方案相比,性能是什么样的.
这是在专家交流中发布的,说VSTO比VBA慢得多,但那是几年前我不知道性能是否有所改善.
http://www.experts-exchange.com/Microsoft/Development/VSTO/Q_23635459.html
谢谢.
我在Visual Studio中引用了一个COM库,因此它为我自动创建了相应的Interop程序集.我想GetType()
对这些com对象做一个,但它们总是返回System.__ComObject
.查询它们的接口有效:
bool isOfType = someComeObject is ISomeComObject; //this works
Run Code Online (Sandbox Code Playgroud)
但我真正想要的是返回com对象的实际类型:
Type type = someComeObject.GetType(); //returns System.__ComObject :-(
Run Code Online (Sandbox Code Playgroud)
有谁知道怎么做我想做的事情?
com-interop ×10
.net ×5
c# ×5
com ×3
interop ×3
excel ×2
32bit-64bit ×1
automation ×1
iis ×1
iis-express ×1
memory-leaks ×1
performance ×1
reflection ×1
vsto ×1