标签: com

13
推荐指数
3
解决办法
9766
查看次数

如何将.tlb作为资源文件嵌入到.NET程序集DLL中?

我们通过COM(CCW)在本机C++中使用.NET Assembly DLL.每当我制作我的DLL的新版本时,我必须向在其代码中使用它的工作人员发送两个文件(.dll和相应的.tlb).

是否可以将.tlb文件作为.NET DLL文件中的资源嵌入?

.net c# com dll ccw

13
推荐指数
1
解决办法
7875
查看次数

释放临时COM对象

使用COM对象考虑以下C#代码.


MyComObject o = new MyComObject;
try
{
 var baz = o.Foo.Bar.Baz;
 try
 { 
  // do something with baz
 }
 finally
 {
  Marshal.ReleaseComObject(baz);
 }
}
finally
{
 Marshal.ReleaseComObject(o);
}

这将释放COM对象obaz,而不是临时对象returnd的o.Fooo.Foo.Bar.当这些对象拥有大量非托管内存或其他资源时,这可能会导致问题.

一个明显但丑陋的解决方案是,使用try-finally和更加混乱代码Marshal.ReleaseComObject.请参阅 C#+ COM Interop,确定性版本

作为一种解决方法,我创建了一个帮助类


class TemporaryComObjects: IDisposable
{
 public C T<C>(C comObject)
 {
  m_objects.Add(comObject);
  return comObject;
 }
 public void Dispose()
 {
  foreach (object o in m_objects)
   Marshal.ReleaseComObject(o);
 }
}

用法:


using (TemporaryComObjects t = new TemporaryComObjects())
{ …
Run Code Online (Sandbox Code Playgroud)

.net c# com interop com-interop

13
推荐指数
1
解决办法
2028
查看次数

以编程方式执行R脚本

我有一个C#程序生成一些R代码.现在我将脚本保存到文件,然后将其复制/粘贴到R控制台.我知道有一个到R的COM接口,但它似乎不适用于最新版本的R(或2.7.8之后的任何版本).有没有什么方法可以在将其保存到文件后以编程方式从C#执行R脚本?

c# com r

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

如何在C++中维护COM对象的弱引用?

在我的应用程序中,我正在挂钩创建COM对象的各种函数(例如CoCreateInstanceEx),以便在创建某个对象时得到通知.我正在跟踪所有创建的对象std::list,我正在迭代该列表以执行各种操作(例如检查已激活的OLE对象).

这个问题是,现在,每当添加一个IUnknown指向我的列表的指针时,我会调用IUnknown::AddRef它以确保它在我跟踪它时不会被破坏.这不是我真正想要的; 对象的生命周期应该与没有我的跟踪代码一样长(或短),所以我宁愿保持对象的弱引用.每当删除对某个跟踪的COM对象的最后一个引用(因此对象被销毁)时,我希望得到通知,以便我可以更新我的簿记(例如,通过在我的列表中设置指针NULL).*

最好的方法是什么?现在,我正在修补所有创建对象的(第一个)VTable,以便IUnknown::Release通过第一个vtable 的调用得到通知.但是,这不适用于从多个接口继承的COM接口(因此有多个vtable),但我不确定这是否真的是一个问题:给定实现QueryInterface规则,应该总是只IUnknown返回一个用IUnknown::QueryInterface,对不对?所以我可以做到这一点然后修补那个vtable.

此外,这种方法也有点毛茸茸,因为它涉及创建产生一些代码的thunk.到目前为止我只为32位实现了这个.这不是一个大问题,但仍然存在.

我真的想知道是否有一种更优雅的方式来对COM对象进行弱引用.有人知道吗?

*:我要解决的下一件事是,如果我有活动迭代器(我使用自定义迭代器对象)遍历COM对象列表,那么这项工作正常.我可能需要跟踪活动迭代器,一旦完成最后一个迭代器,从列表中删除所有空指针.或类似的东西.

c++ windows com weak-references

13
推荐指数
1
解决办法
1515
查看次数

为什么不能通过.NET中的COM使用.NET COM库?

现在,我知道如果库是在.NET中,通过COM访问它有点没有意义,但是,我有点困惑,因为如果我要求某人写一个库并通过COM公开它,那么任何人都应该可以自由地使用任何语言.

对我来说,编写COM库的语言并不重要,为什么它重要?

作为参考,当您在.NET库生成的.tlb文件上使用tlbimp时会发生这种情况:

C:\dev>tlbimp test.tlb
Microsoft (R) .NET Framework Type Library to Assembly Converter 4.0.30319.1
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : error TI1029 : Type library 'test' was exported from
a CLR assembly and cannot be re-imported as a CLR assembly.
Run Code Online (Sandbox Code Playgroud)

另外,我的测试COM库使用IUnknown,仅支持早期绑定的COM互操作.

.net com

13
推荐指数
2
解决办法
5030
查看次数

为什么我不能将我的COM对象转换为它在C#中实现的接口?

我在dll中有这个接口(此代码在元数据中显示在Visual Studio中):

#region Assembly XCapture.dll, v2.0.50727
// d:\svn\dashboard\trunk\Source\MockDiagnosticsServer\lib\XCapture.dll
#endregion

using System;
using System.Runtime.InteropServices;

namespace XCapture
{
    [TypeLibType(4160)]
    [Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")]
    public interface IDiagnostics
    {
        [DispId(1)]
        void GetStatusInfo(int index, ref object data);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我用这样的类创建了一个COM服务器:

[ComVisible(true)]
[Guid(SimpleDiagnosticsMock.CLSID)]
[ComDefaultInterface(typeof(IDiagnostics))]
[ClassInterface(ClassInterfaceType.None)]
public class SimpleDiagnosticsMock : ReferenceCountedObject, IDiagnostics
{
    public const string CLSID = "281C897B-A81F-4C61-8472-79B61B99A6BC";

    // These routines perform the additional COM registration needed by 
    // the service. ---- stripped from example

    void IDiagnostics.GetStatusInfo(int index, ref object data)
    {
        Log.Info("GetStatusInfo called with index={0}, data={1}", index, data); …
Run Code Online (Sandbox Code Playgroud)

c# com

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

如何在C++中调用IE中的eval()?

随着IE11的出现,IHTMLWindow2::execScript()不推荐使用.推荐的方法是使用eval()代替.我通过其C++ COM接口自动化IE,我一直无法找到如何实现这一点.有人能指出我在搜索中明显错过的例子吗?如果无法执行代码eval,那么将JavaScript代码注入到现在execScript不再可用的Internet Explorer实例中的适当方法是什么?

编辑:任何适用于我正在进行的项目的解决方案必须在进程外工作.我没有使用浏览器助手对象(BHO)或任何类型的IE插件.因此,任何涉及无法正确编组交叉过程的接口的解决方案都不适用于我.

c++ com internet-explorer

13
推荐指数
1
解决办法
5723
查看次数

接口无法实例化,但这是一个例外

看到我实际上必须实例化一个接口以在C#中使用Word Interoop后,我感到非常惊讶.

Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
Run Code Online (Sandbox Code Playgroud)

Microsoft.Office.Interop.Word.Application按什么它的XML文档说是一个接口:

在此输入图像描述

怎么可能,视觉工作室把它与别的东西混淆了?或者是什么允许实例化这个接口?

c# com interface office-interop

13
推荐指数
1
解决办法
239
查看次数

使用COM调用者引用引用

我有这样的场景:

  1. 使用VBA从MS Access应用程序调用COM
  2. 调用是我们正在构建的C#库,它引用了Newtonsoft.Json v9
  3. 库使用具有自己的Newtonsoft.Json v6依赖性的nuget包(Say,Microsoft.AspNet.WebApi.Client)
  4. 当他们尝试使用Newtonsoft.Json(或任何与我们的C#库引用的版本不同的库)时,它自己的黑盒代码中的依赖库会爆炸

错误:

Could not load file or assembly 'Newtonsoft.Json, Version=6.0.4.0, Culture=neutral, 
PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. 
The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)

我希望我需要类似dependentAssembly重定向绑定的地方,就像你在.Net中使用的那样,以指示如何解决这些类型的事情,但我没有找到任何通过我的搜索,告诉我可能需要去哪里引用在COM中组装以获取它.

值得注意的是,在Newtonsoft.Json的情况下,降级到6.0.4不是一个修复,因为在我们使用的各种包中有多个对Json.Net的引用,所以我没有权力只选择一个版.

此外,在我们在库开发期间使用的.Net测试器应用程序中,一切都按预期工作,并且参考文献自己也使用正确的版本.所以我相信我需要弄清楚如何告诉COM找到它想要的东西.

任何帮助表示赞赏!谢谢.

c# com access-vba

13
推荐指数
1
解决办法
207
查看次数