poniedziałek, 10 maja 2010

Atrybut TypeForwardedTo (C# .NET) [PL]

Promuj

Czasem jest potrzeba przeniesienia jakiejś klasy z jednej biblioteki (assembly) do drugiej. Jest to dość powszechna czynność, ale może sprawić problem, a mianowicie co zrobić, jeżeli nie możemy przekompilować aplikacji, która z pewnej biblioteki korzysta, a właśnie wykorzystana klasa została przeniesiona do innej biblioteki. Na szczęście jest na to lekarstwo: TypeForwardedTo.

Przeanalizujmy przykład.
Mamy proste solution:
Aplikacja TypeForwardedTo ma referencję do ClassLibrary1, w której znajduje się prosta klasa (Class1.cs):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ClassLibrary
{
    public class MyClass
    {
        public static string DoSth()
        {
            return Assembly.GetAssembly(typeof(MyClass)).FullName;
        }
    }
}
Natomiast program główny (Program.cs) wygląda następująco:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ClassLibrary;

namespace TypeForwardedTo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(MyClass.DoSth());
            Console.ReadLine();
        }
    }
}
Niestety jednak wymyśliło nam się by przenieść MyClass do nowego assembly ClassLibrary2. Robimy więc kolejne solution:
Zmieniamy pliki:
Class1.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ClassLibrary
{
    //public class MyClass
    //{
    //    public static string DoSth()
    //    {
    //        return Assembly.GetAssembly(typeof(MyClass)).FullName;
    //    }
    //}
}
Class2.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ClassLibrary
{
    public class MyClass
    {
        public static string DoSth()
        {
            return Assembly.GetAssembly(typeof(MyClass)).FullName;
        }
    }
}
Niestety aplikacja jest już skompilowana, a nam ktoś Zły zabronił ją przekompilować. Co zrobić?
Wystarczy do AssemblyInfo biblioteki ClassLibrary1 dodać linię:
[assembly: TypeForwardedTo(typeof(ClassLibrary.MyClass))]
Przekompilować dwie biblioteki, przegrać je do katalogu z naszą aplikacją TypeForwardedTo i... działa:


Proste prawda?
Promuj

1 komentarz:

Posty powiązane / Related posts