4

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

我试过了:

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

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

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

这些方法都不起作用。有没有办法可以指定要在 using 语句中查看的 dll 的名称?

4

4 回答 4

6

您需要为原始程序集设置别名,并使用 anextern alias在新程序集中引用原始程序集。这是使用别名的示例。

extern alias LauncherOriginal;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace foo
{
    public class Launcher : LauncherOriginal.foo.Launcher
    {
        ...
    }
}

这是一个演练,解释了如何实现它。

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

于 2012-06-01T15:32:18.570 回答
2

正如克里斯所说,您可以在原始程序集中使用别名。

如果你不能那样做,那么你可以通过使用第三个程序集来作弊

Assembly1.dll(您的原始文件)

namespace foo { 
     public class Launch {}
}

Assembly2.dll(虚拟)

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

Assembly3.dll(你的插件)

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

我什至不以此为荣!

于 2012-06-01T15:34:19.383 回答
0

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

于 2012-06-01T15:11:28.983 回答
0

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

例如:

//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
于 2012-06-01T17:35:39.100 回答