Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2012 托管ref类能否直接实现COM接口?_Visual Studio 2012_Com_C++ Cli_Com Interop - Fatal编程技术网

Visual studio 2012 托管ref类能否直接实现COM接口?

Visual studio 2012 托管ref类能否直接实现COM接口?,visual-studio-2012,com,c++-cli,com-interop,Visual Studio 2012,Com,C++ Cli,Com Interop,是否有一种内置方式允许托管ref类实现并公开可从本机代码安全调用的COM接口 从C端看,通过使用适当的COM互操作属性装饰目标接口,可以很容易地做到这一点,例如: 本机接口 托管等效接口 完成此声明后,通过p-Invoke的魔力,您可以执行以下操作: public class FooClass : ISampleGrabberCB { int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLe

是否有一种内置方式允许托管ref类实现并公开可从本机代码安全调用的COM接口

从C端看,通过使用适当的COM互操作属性装饰目标接口,可以很容易地做到这一点,例如:

本机接口

托管等效接口

完成此声明后,通过p-Invoke的魔力,您可以执行以下操作:

public class FooClass : ISampleGrabberCB {
    int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) {
       Console.WriteLine("BufferCB called");
    }
    int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample) {
       Console.WriteLine("SampleCB called");
    }

   public void SomeMethod(IBaseFilter aDirectShowFilter) {
      ISampleGrabber sampleGrabber = (ISampleGrabber)aDirectShowFilter;
      // By the magic of PInvoke, this is possible and works! 
      // ISampleGrabber->SetCallback() is expecting an ISampleGrabberCB* COM interface
      // After the following line, native code is able to callback safely
      // into our managed code
      sampleGrabber.SetCallback(this, 0);
   }
}
有没有办法在C++/CLI上模拟这种行为?
显然,C使用的互操作管道使这成为可能。此外,编译器可以通过检查可用的本机接口生成必要的托管接口。我仍然认为我们需要提供相关的GUI,由于这不是本机界面中的一个属性,我只是对这个主题感到好奇,并仔细研究了一下,发现了一些细微的区别:

我的电脑上有IVI-COM类库,我一直想尝试与其中一些类库接口,尽管IVI也有.Net接口,所以没有太多意义

我从C开始,在那里我们得到了良好的智能感知支持。我已经添加了必要的引用,并在我的项目中添加了一个类。通过对象浏览器,我们可以选择一个界面

public class MyDmm : IIviDmmMultiPoint
{
}
之后,只需使用IntelliSense Ctrl-。添加“using”语句,让他们为我们创建必要的属性和方法

using Ivi.Dmm.Interop;
///...
public int Count
{
    get
    {
        throw new NotImplementedException();
    }
///...
现在我们需要C++-CLI方言:如下所示:

using namespace IviDmmLib;
///...
public ref class Dmm : IIviDmmMultiPoint
{
请注意,using语句使用的名称不同,我们可以通过在解决方案资源管理器中选择引用并检查下面“属性”中显示的名称来获得此名称

我没有完全完成实验,但是我看到COM库是x64位的,所以我们可以为同样的目的编译这个项目

其他有趣的读物:


如果您发现更多的差异,请给我反馈,这样我们也可以把它们放在这里。

您删除了我的评论,但它仍然像泥一样厚。我们已经知道这种代码是什么样子的,我们看不到您尝试了什么。这在C++/CLI中没有任何不同。CLR不会告诉您使用哪种托管语言,它与MSIL一起工作。像Regasm.exe和Tlbexp.exe这样的实用程序也没有。关键词是不同的,仅此而已。嗨@HansPassant,我没有删除你的评论,我在这个问题上收到的唯一反馈是反对票@汉斯帕桑,我明白你的意思。我的问题形式不正确。基本上,我想知道的是,如果有一些类似GCROOT的编译器魔法,可以让我说这个托管类实现了这个COM接口,并且让我提供在本机C++侧已经可用的本机接口,对我来说,这样的机制可能存在,考虑到C++/CLI给native code interaction.wow带来的巨大简化,我完全忘记了一个事实,即您可以导入COM库并让VS生成互操作接口!最近我做了很多DirectShow编程,从我遵循的一个示例开始,我开始手工实现它们!谢谢请不要破坏你的帖子,为别人做更多的工作。通过在Stack Exchange SE网络上发布,您已根据a授予SE分发内容的不可撤销权利,即无论您未来的选择如何。根据SE政策,分发非故意破坏版本。因此,任何故意破坏行为都将恢复原状。请参阅:。如果允许删除,在帖子下方左侧有一个删除按钮,但它只在浏览器中,而不是在移动应用程序中。
using Ivi.Dmm.Interop;
///...
public int Count
{
    get
    {
        throw new NotImplementedException();
    }
///...
using namespace IviDmmLib;
///...
public ref class Dmm : IIviDmmMultiPoint
{