C# 子类,同时保留名称.深巫毒教

本文关键字:保留 子类 | 更新日期: 2023-09-27 18:36:05

我有一个我正在使用的dll,它包含一个类foo。发射。 我想创建另一个子类启动的 dll。 问题是类名必须相同。 这被用作另一个软件和foo的插件。启动类是启动插件的敌人。

我试过:

namespace foo
{
    public class Launch : global::foo.Launch
    {
    }
}

using otherfoo = foo;
namespace foo
{
    public class Launch : otherfoo.Launch
    {
    }
}

我还尝试在引用属性中指定别名,并在代码中使用该别名而不是全局,这也不起作用。

这两种方法都不起作用。 有没有办法指定要在 using 语句中查找的 dll 的名称?

C# 子类,同时保留名称.深巫毒教

您需要为

原始程序集设置别名,并使用extern alias在新程序集中引用原始程序集。下面是使用别名的示例。

extern alias LauncherOriginal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace foo
{
    public class Launcher : LauncherOriginal.foo.Launcher
    {
        ...
    }
}

下面是一个演练,说明如何实现它。

另外,您

提到您之前尝试使用别名并遇到了问题,但您没有说它们是什么,所以如果这不起作用,那么请提及出了什么问题。

正如

Chris 所说,您可以在原始程序集上使用别名。

如果你不能这样做,那么你也许可以使用第三个程序集作弊

组装1.dll(您的原件)

namespace foo { 
     public class Launch {}
}

组装2.dll(虚拟)

namespace othernamespace { 
     public abstract class Dummy: foo.Launch {}
}

Assembly3.dll(您的插件)

namespace foo{ 
     public class Launch: othernamespace.Dummy{}
}

我什至不为此感到骄傲!

如果在另一个命名空间中定义类名,它可以是相同的,但它令人难以置信为什么有人想对自己这样做。

也许你需要使用外部别名。

例如:

//in file foolaunch.cs
using System;
namespace Foo
{
    public class Launch
    {
        protected void Method1()
        {
            Console.WriteLine("Hello from Foo.Launch.Method1");
        }
    }
}
// csc /target:library /out:FooLaunch.dll foolaunch.cs
//now subclassing foo.Launch
//in file subfoolaunch.cs
namespace Foo
{
    extern alias F1;
    public class Launch : F1.Foo.Launch
    {
        public void Method3()
        {
            Method1();
        }
    }
}

// csc /target:library /r:F1=foolaunch.dll /out:SubFooLaunch.dll subfoolaunch.cs
// using
// in file program.cs
namespace ConsoleApplication
{
    extern alias F2;
    class Program
    {
        static void Main(string[] args)
        {
            var launch = new F2.Foo.Launch();
            launch.Method3();
        }
    }
}
// csc /r:FooLaunch.dll /r:F2=SubFooLaunch.dll program.cs