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 的名称?
您需要为
原始程序集设置别名,并使用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