标签: com-interop

如何正确清理Excel互操作对象?

我在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# excel interop com-interop

733
推荐指数
20
解决办法
30万
查看次数

由于以下错误,检索具有CLSID {XXXX}的组件的COM类工厂失败:80040154

我使用C#.NET开发了一个Windows服务来生成PDF报告.要生成PDF文件,我使用的是第三方dll.该应用程序在我的Windows XP平台上运行.当我在Windows Server 2008 64位版本中部署该服务时,我收到此错误:

由于以下错误,检索具有CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}的组件的COM类工厂失败:80040154.

我使用regsvr32命令注册了DLL.我能够在注册表中看到这个CLSID.但问题仍然存在.

可能是什么问题呢?

.net windows-services com-interop 32bit-64bit

272
推荐指数
10
解决办法
47万
查看次数

解读"记忆泄漏"

在.NET透视图中:

  • 什么是内存泄漏
  • 如何确定您的应用程序是否泄漏?有什么影响?
  • 你怎么能防止内存泄漏?
  • 如果您的应用程序有内存泄漏,它会在进程退出或被杀死时消失吗?或者,即使在流程完成后,应用程序中的内存泄漏也会影响系统上的其他进程?
  • 那么通过COM Interop和/或P/Invoke访问的非托管代码呢?

.net performance memory-leaks com-interop

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

"注册COM Interop"vs"使程序集COM可见"

这两个选项之间的真正区别是什么?我所知道的是:

注册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)

.net com-interop compiler-options visual-studio

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

将一个简单的C#DLL转换为COM互操作组件

如何将C#DLL转换为可由VB6应用程序使用的COM互操作DLL?

.net c# com interop com-interop

65
推荐指数
3
解决办法
7万
查看次数

类型存在于2个程序集中

我从两个不同的第三方COM DLL创建了两个.NET Interop程序集.两个COM DLL都包含一个名为的类型COMMONTYPE.因此,COMMONTYPE现在也通过两个Interop组件暴露.

我有第三个需要使用这两个Interop程序集的项目,我得到了臭名昭着的编译时错误:

该类型<ABC>存在于<ASSEMBLY1.dll><ASSEMBLY2.dll>

由于COM DLL是由第三方供应商提供的,因此我无法访问源代码,而且我正在编写一个C#Console应用程序,这意味着我没有web.config文件,我可以在其中添加debug=false解决方法.我能做什么?

c# com-interop

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

"注册COM Interop"实际上做了什么?

VS项目选项"注册COM互操作"到底是做什么的?因为当我使用此选项构建我的库时,我可以从VBScript上调用我的库中的CreateObject.但如果我没有这个构建然后手动运行regasm CreateObject失败.所以我想知道 - VS2010做了什么,我没做什么?

com-interop visual-studio-2010 visual-studio

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

以编程方式启动和停止IIS Express

我正在尝试在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)

c# com iis com-interop iis-express

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

实时(未保存)Excel数据和C#对象之间最快的接口方式

我想知道从打开的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

谢谢.

c# excel automation vsto com-interop

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

如何获取COM对象的类型

我在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)

有谁知道怎么做我想做的事情?

.net com reflection interop com-interop

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