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

元のアセンブリにエイリアスを設定し、 を使用し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
    {
        ...
    }
}

これを実装する方法を説明するウォークスルーを次に示します。

また、以前にエイリアスを使用しようとして問題が発生したとのことでしたが、問題が何であったかについては言及していませんでした。これが機能しない場合は、何が問題だったのかをお知らせください。

于 2012-06-01T15:32:18.570 に答える
2

Chris が言ったように、元のアセンブリでエイリアスを使用できます。

それができない場合は、3番目のアセンブリを使用してごまかすことができるかもしれません

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

おそらく、extern エイリアスを使用する必要があります。

例えば:

//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 に答える
0

クラス名は、別の名前空間で定義されている場合は同じにすることができますが、なぜ誰もが自分自身にそれをしたいのか気が遠くなります.

于 2012-06-01T15:11:28.983 に答える