【问题标题】:referencing an uncompiled c# class引用未编译的 c# 类
【发布时间】:2009-09-21 10:00:37
【问题描述】:

这可能是一个奇怪的问题。

我需要后期绑定一个未编译的 c# 类 (.cs)。甚至不确定这是否可能。该类不会成为项目的一部分或被引用。我唯一知道的是它的文件位置。

该文件不会在执行时编译,因为它将是网站 app_code 的一部分。只需尝试创建它的一个实例,然后在其上调用一个函数。

这可能吗?

提前致谢

【问题讨论】:

  • 不清楚这个类是否会在执行时编译,或者你想用它做什么。请提供更多详细信息。

标签: c# binding reference


【解决方案1】:

听起来您想在运行时编译和引用您的类。这绝对是可能的。

这篇文章应该为你指明正确的方向...http://support.microsoft.com/kb/304655

请记住,一旦将程序集加载到内存中,除非您卸载整个应用程序域,否则您无法卸载它。因此,如果您需要能够卸载代码,则必须将其加载到新的 AppDomain 中。

【讨论】:

    【解决方案2】:

    您没有询问编译,所以我假设您只想实例化该类并使用它。

    你应该让这个类实现一个覆盖你需要的功能的接口,然后你可以使用Activator class来实例化它:

    ObjectHandle fooHandle = Activator.CreateInstanceFrom(
       @"C:\somePath\FooAssembly.dll", "FooNamespace.Foo");
    IFoo foo = (IFoo)fooHandle.Unwrap();
    

    该类应该有一个默认构造函数。如上所述按名称加载程序集时,请考虑安全隐患。

    【讨论】:

      【解决方案3】:

      您可以使用 CodeProvider 类

      CodeDomProvider cdp = Microsoft.CSharp.CSharpCodeProvider.CreateProvider("CSharp");
      CompilerResults cr = cdp.CompileAssemblyFromFile(<CompilerParameters>,<string [] of files to compiler>);
      

      只需替换为您需要的正确对象 并使用实际文件名的字符串数组。

      您也可以将代码加载到字符串中并直接从那里编译

      然后可以在

      中找到生成的程序集
      cr.CompiledAssembly
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        相关资源
        最近更新 更多