相关疑难解决方法(0)

C#编译器如何检测COM类型?

编辑:我已将结果写成博客文章.


C#编译器有点神奇地处理COM类型.例如,这个陈述看起来很正常......

Word.Application app = new Word.Application();
Run Code Online (Sandbox Code Playgroud)

......直到你意识到这Application是一个界面.在接口上调用构造函数?Yoiks!这实际上被转换为对Type.GetTypeFromCLSID()另一个的调用Activator.CreateInstance.

此外,在C#4中,您可以对ref参数使用非ref 参数,并且编译器只是添加一个局部变量以通过引用传递,丢弃结果:

// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
Run Code Online (Sandbox Code Playgroud)

(是的,有一堆参数丢失.不是可选参数好吗?:)

我正在尝试调查编译器的行为,我没有假装第一部分.我可以做第二部分没有问题:

using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
    void Foo(ref int x);
}

class Test
{
    static void Main()
    {
        Dummy dummy = null;
        dummy.Foo(10);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想能够写:

Dummy dummy = new Dummy();
Run Code Online (Sandbox Code Playgroud)

虽然.显然它会在执行时爆炸,但没关系.我只是在试验.

编译器为链接的COM PIA(CompilerGeneratedTypeIdentifier)添加的其他属性似乎没有做到这一点......什么是神奇的酱油?

c# compiler-construction com c#-4.0

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

"新建"接口

几天前,我看到CoClassAttribute以我以前没有想到的方式使用.


[ComImport, CoClass(typeof(Foo)), Guid("787C1303-AE31-47a2-8E89-07C7257B1C43")]
interface IFoo {
    void Bar();
}

class Foo : IFoo {
    public void Bar() {
        Console.WriteLine("Oh retado!");
    }
}

Run Code Online (Sandbox Code Playgroud)

用作:


class CoClassDemo {
    public static void Show() {
        var a = new IFoo();
        a.Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该不会让我感到惊讶,因为自.NET Framework早期以来,COM Interop正是这样做的.在.NET Reflector中挖掘COM Interop代码时,我根本没有那么多关注.


method public hidebysig static void Show() cil managed
{
    .maxstack 1
    .locals init (
        [0] class ConsoleApplication1.IFoo a)
    L_0000: nop 
    L_0001: newobj instance void ConsoleApplication1.Foo::.ctor()
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: callvirt instance void ConsoleApplication1.IFoo::Bar()
    L_000d: …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection mocking

7
推荐指数
1
解决办法
1674
查看次数

如何实现接口的默认方法?

在.Net中创建一个新类时,如果我将其声明为“ Implements IDisposable”并按Enter,则可以看到Visual Studio通过其elertt添加了已经填充到我的类中的不同方法和函数。当我尝试使用接口执行此操作时,它将创建方法和函数。

有什么方法可以提供我的方法和函数的默认实现吗?

我一直在寻找链接,但无法解决我的问题。

我正在寻找实现的示例:

#Region "IDisposable Support"
    Private disposedValue As Boolean ' To detect redundant calls

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: dispose managed state (managed objects).
            End If

            ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
            ' TODO: set large fields to null.
        End If
        Me.disposedValue = True
    End Sub

    ' TODO: override Finalize() only …
Run Code Online (Sandbox Code Playgroud)

.net vb.net interface visual-studio

5
推荐指数
1
解决办法
525
查看次数