相关疑难解决方法(0)

基于接口的方法是否应该调用使用"动态"仍遵循C#方法解析规则?

据我了解,每种语言都可以拥有自己的dynamic处理程序,因此适用相应的规则.我不确定以下是否正确/不正确; 想法?

场景:使用一些方法的两个接口(一个实现另一个):

public interface IA {
    void Bar(object o);
}
public interface IB : IA {
    void Foo(object o);
}
Run Code Online (Sandbox Code Playgroud)

和一个基本的实现:

public class B : IB {
    public void Foo(object o) { Console.WriteLine("Foo"); }
    public void Bar(object o) { Console.WriteLine("Bar"); }
}
Run Code Online (Sandbox Code Playgroud)

现在,使用正常的C#(no dynamic),我们可以IA从类型的目标访问方法IB:

IB b = new B();
var o = new { y = "z" };
b.Foo(o.y); // fine
b.Bar(o.y); // fine
Run Code Online (Sandbox Code Playgroud)

现在让我们故意dynamic在参数中添加一些,这使得整个调用都使用dynamic处理(在一般情况下,这可能会影响重载解析,尽管它不会在这里):

IB …
Run Code Online (Sandbox Code Playgroud)

c# dynamic

17
推荐指数
1
解决办法
408
查看次数

与IIS 7.5结合使用的动态语言运行库中的错误

我为这个问题长度道歉,但我认为你们都觉得值得.在开始之前,让我说我真的想要生成一个独立的控制台应用程序,但遗憾的是,事实证明这是不可能的.该错误不会发生在控制台应用程序中.它不会发生在一个独立的ASP.NET应用程序中.它仅在Windows 7上的IIS 7.5中运行时发生.

该错误似乎与动态语言运行时有关,因为它涉及__TransparentProxy(通过WCF)和dynamic变量(int)的组合.产生问题的那一行是调用一个传递代理和动态int的静态方法(碰巧不包含方法体).

一旦调用该方法,w3wp.exe进程占用整个CPU并开始非常快速地增加内存(对我来说,每秒大约100兆,尽管它可能因为GC而逐渐减少).

若要重现此错误,请在Visual Studio中创建一个新的ASP.NET网站("新建"|"项目""C#"|"Web"|"ASP.NET Web应用程序").然后在IIS中创建一个新站点,其主目录是您的新项目.(另外,为每个人提供对该文件夹的完全读/写访问权限,并确保应用程序池使用.NET 4.0)为新站点提供特定端口,如7080.最后,将此代码粘贴到Global.asax.cs中:

public class Global : System.Web.HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        dynamic dynamicId = 5;

        var serviceUrl = "http://localhost:7182/FooServices.svc";
        ChannelFactory factory = new ChannelFactory<IFooServices>(new WSHttpBinding(), new EndpointAddress(serviceUrl));
        factory.Open();
        IFooServices fooServices = ((ChannelFactory<IFooServices>)factory).CreateChannel();

        BlowUpTheProgram(fooServices, dynamicId);  // This line hangs
    }

    [ServiceContract]
    public interface IFooServices
    {
        [OperationContract]
        void Bar();
    }

    public static void BlowUpTheProgram(IFooServices eventServices, int authorMailboxId)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

现在通过http://localhost:7080(或您选择的任何端口)访问浏览器中的站点.让任务管理器准备就绪,因为您需要在确认报告的症状后终止w3wp.exe进程.

要确认代理和动态是否正在共同解决此错误,请更改此行:

dynamic dynamicId …
Run Code Online (Sandbox Code Playgroud)

c# dynamic-language-runtime dynamic iis-7.5 transparentproxy

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