Tag: com

如何从vbScript调用.NET代码(C#/ vb.net)?

我想我可以编译一个C#DLL然后将它作为COM对象公开,以便它可以从VBscript创建。 我只是不确定这样做的步骤……

关闭Excel应用程序的正确方法

我正在编写一个应用程序,它使用以下代码访问Excel文件: RBTApplication = new Excel.Application(); RBTWorkbooks = RBTApplication.Workbooks; RBTWorkbook = RBTApplication.Workbooks.Open( RBTDataSet.Instance.FilePath, 0, true, 5, “”, “”, true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, “\t”, true, false, 0, true, 1, 0 ); RBTWorksheet = (Excel.Worksheet)RBTWorkbook.Worksheets.get_Item( 1 ); RBTRange = RBTWorksheet.UsedRange; 在我加载了我需要的数据后,我尝试用这段代码关闭Excel应用程序: RBTWorkbook.Close(); RBTApplication.Quit(); RBTWorksheet.ReleaseComObject(); RBTWorkbook.ReleaseComObject(); RBTWorkbooks.ReleaseComObject(); RBTApplication.ReleaseComObject(); 我的问题是EXCEL.EXE进程仍在运行。 杀死所有Excel进程的简单解决方案听起来不太好,因为我的进程可能是同时使用的许多电子表格之一。 这个也会影响打开新的excel电子表格 – 每个电子表格都是只读的,直到我不会杀死这个过程。 那么……如何正确关闭这个应用程序或者杀死这个特定的进程(有没有办法从COM对象中获取PID?)。 我想我找到了一个(还没试过) – 在打开新的ExcellApp之前和之后获取excell进程列表,比较列表(得到差异),杀死知道其PID的特定进程。 但是这个解决方案似乎不是从我的应用程序中处理COM对象和其他应用程序的正确方法。

DEBUG ERROR:在vc ++项目中使用COM时出现所需的运行时?

我为我的工作创建了一个COM组件。 我也注册了该组件。 在我的系统上,我有两个VM工作站。 在我的第一个工作站,它工作正常。 在我的第二个工作站中,它会显示一个错误框,其中包含此程序需要朗读的消息并以不寻常的方式关闭请联系应用程序管理员 。 我认为这是因为没有在第二个工作中注册dll然后我注册并且它工作正常。 当我试图在win2k8机器上测试相同时,即使我成功注册COM组件,它显示上面说的erroe窗口? 任何人都可以帮我理解这个吗? 提前致谢…

通过COM Interop公开C#类

我有一个C#类库,还有一个powerbuilder应用程序。 我想公开c#类并在powerbuilder应用程序中使用它。 我使用以下博客来公开这些function,以便powerbuilder应用程序访问它https://whoisburiedhere.wordpress.com/2011/07/12/creating-a-com-object-from-scratch-with-c/ http ://jumbloid.blogspot.com/2009/12/making-net-dll-com-visible.html 所以我暴露了COM并使其在powerbuilder中可访问,但我仍然有一些基本问题,以确保我遵循最佳指导方针。 该类在转换为COM之前看起来像 class classname { function1(){//do something} function2(){//do something} function3(){//do something} function4(){//do something} } 要转换为COM我创建了一个接口,我想只公开function1和function2。 所以我修改了类 [ComVisible(true)] [Guid(“03S3233DS-EBS2-5574-825F-EERSDG8999”),InterfaceType(ComInterfaceType.InterfaceIsDual)] interface Iinterface { function1(); function2(); } 在主类中,我做了以下修改1.我在AssemblyInfo中将COM可见属性设置为false,因为我不想公开所有公共方法。 2.class级看起来像 [ComVisible(true)] [Guid(“2FD1574DS4-3FEA-455e-EW60A-EC1DFS54542D”), ClassInterface(ClassInterfaceType.None)] class class1 : Iinterface { function1(){//do something} function2(){//do something} [ComVisible(false)] //i don’t want the mehtod to be exposed function3(){//do something} [ComVisible(false)] […]

当从针对任何CPU的C#项目调用时,为什么此代码会抛出System.AccessViolationException?

我的ATL项目中有这个IDL: [ object, uuid(61B0BFF7-E9DF-4D7E-AFE6-49CC67245257), dual, nonextensible, pointer_default(unique) ] interface ICrappyCOMService : IDispatch { typedef [ uuid(C65F8DE6-EDEF-479C-BD3B-17EC3F9E4A3E), version(1.0) ] struct CrapStructure { INT ErrorCode; BSTR ErrorMessage; } CrapStructure; [id(1)] HRESULT TestCrap([in] INT errorCode, [in] BSTR errorMessage, [in, out] CrapStructure *crapStructure); }; [ uuid(763B8CA0-16DD-48C8-BB31-3ECD9B9DE441), version(1.0), ] library CrappyCOMLib { importlib(“stdole2.tlb”); [ uuid(F7375DA4-2C1E-400D-88F3-FF816BB21177) ] coclass CrappyCOMService { [default] […]

COM对象excel互操作清理

假设我有一个组件正在使用Workbook对象,并且在该方法体的中间某处我调用了另一个类的某个方法。 例如: public class MainComponent { public void MyMainMethod() { OtherComponent otherComponent = new OtherComponent(); Workbook document; // some work with workbook object // working with document and worksheet objects. otherComponent.MethodCall(document); // some work with workbook object and it’s worksheets. foreach(Worksheet sheet in document.Workheets) // do something with sheet } } public class OtherComponent { […]

注册C#COM对象而没有RegAsm的真实文件

我有一个奇怪的应用程序加载机制。 我有一个boostrapping exe文件,包含所有其他DLL和应用程序本身的资源。 这些文件(程序集)是从资源中提取并加载的,因为我附加到当前AppDomain的Assemblyresolve事件。 [STAThread] static void Main() { // if the command line contains extract then extract the dlls, next run will resolve assemblies from disk bool saveDllsToDisk = new List(Environment.GetCommandLineArgs()).Contains(“extract”); // if the command line contains bin then use the bin folder instead of temp to extract dlls bool useBinFolder = new List(Environment.GetCommandLineArgs()).Contains(“bin”); […]

在IIS服务下使用COM将PowerPoint渲染到C#中时出现问题

首先,我的程序可以渲染pptx到png,在Windows Server 2008 R2上渲染时质量大大降低,我想知道为什么。 我使用Cassini在Windows 7 x64上测试了我的程序,并且ppt的png渲染是完美的。 但是当我在IIS上部署我的程序并尝试渲染pptx时,其渲染质量会降低。 这是链接相同的图像,一个在Windows 7 cassini下呈现,另一个在windows server 2008下呈现。 完美品质: http : //dl.dropbox.com/u/2458800/exemple-high-quality.png 低质量的: http : //dl.dropbox.com/u/2458800/exemple-low-quality.png 它似乎是某种抗锯齿问题。 最后,这是我的代码: var powerPoint = new Application(); var presentation = powerPoint.Presentations.Open(sourceFile, MsoTriState.msoFalse, MsoTriState.msoTriStateMixed, MsoTriState.msoFalse); presentation.Export(destinationDir, “png”, 960, 720); presentation.Close(); powerPoint.Quit(); 编辑: 嗯,我知道使用PowerPoint COM会在服务器上出现问题。 试过Aspose,解决了这个问题。

C#字符串编组和LocalAlloc

我有一个来自非托管DLL的COM回调,我需要在C#中使用它。 非托管DLL期望被调用者使用LocalAlloc (调用者将使用LocalFree )分配内存,使用WSTR填充它并分别设置value和chars到WSTR指针和字符串长度。 代码片段我正在尝试转换为C#: STDMETHODIMP CMyImpl::GetString(LPCSTR field, LPWSTR* value, int* chars) { CStringW ret; if (!strcmp(field, “matrix”)) { ret = L”None”; if (…) ret.Append(L”001″); else if (…) ret.Append(L”002″); else ret.Append(L”003″); } if (!ret.IsEmpty()) { int len = ret.GetLength(); size_t sz = (len + 1) * sizeof(WCHAR); LPWSTR buf = (LPWSTR)LocalAlloc(LPTR, sz); if (!buf) { […]

如何将字节数组作为UDT属性从VB6 / VBA传递到C#COM DLL?

我有一个C#库,我正试图向VBA公开。 我可以很好地将参数传递给函数(即“ref byte [] someArray”),但传递对象或结构只是不起作用。 如果我尝试传递一个字节数组作为类的属性,我在VB-中得到以下错误 标记为受限制的函数或接口,或者该函数使用Visual Basic中不支持的自动化类型 如果我尝试传递一个字节数组作为结构的属性,我在VB-中得到以下错误 我已经打了两天了,而且我一直在寻找那些声称有答案的post,但是没有一个能为我效力。 所以这是我目前的代码: [ComVisible(true)] [Guid(“7F53F7A5-15C9-4A99-A855-38F5E87702D0”)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] // Tried as InterfaceIsDual and as InterfaceIsIDispatch public interface IDetail { [DispId(1)] // Tried with and without these int SomeInt { get; set; } [DispId(2)] string SomeString { get; set; } [DispId(3)] byte[] SomeByteArray { return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] get; […]