type
t1 = class
public static procedure p1;
begin
end;
end;
begin
try
var ad := System.AppDomain.CreateDomain('domain 2');
ad.DoCallBack(t1.p1);
except
on e: Exception do writeln(e);
end;
end.
Этот код падает с TypeLoadException. И вроде ведь несколько месяцев назад работало.
Посмотрел как выглядит t1 в .exe и написал такой же тип в C# - всё работает без ошибок:
using System;
namespace Test1
{
public class t1
{
public void Init()
{
}
public static void p1()
{
}
public t1()
{
this.Init();
}
}
static class Program
{
public static void Main(string[] args)
{
try {
var ad = AppDomain.CreateDomain("domain 2");
ad.DoCallBack(t1.p1);
} catch (Exception e) {
Console.WriteLine(e);
}
Console.ReadLine();
}
}
}
unit u1;
interface
type
t2 = partial class end;
t1 = partial class
public next: t2;
end;
implementation
uses u2;
end.
unit u2;
interface
type
t1 = partial class end;
t2 = partial class
// public next: t1; // если раскомментировать - t2 вообще перестаёт существовать
end;
implementation
uses u1;
end.
И t1 и t2 добавляет по 2 раза, причём у дубля t1 нету ни 1 поля.
Есть ли смысл заливать в issue, или пока рано partial классы насиловать?
Так-то это и не должно работать. Все части partial-класса должны находиться в одном пространстве имён.
using System;
namespace ConsoleApp1
{
namespace A
{
partial class Class1
{
}
}
namespace B
{
partial class Class1
{
}
}
public static class Program
{
public static void Main()
{
Console.WriteLine(typeof(A.Class1).GetHashCode() == typeof(B.Class1).GetHashCode());
Console.ReadKey();
}
}
}
В модулях кстати надо это осмыслить. С одной стороны модули - это разные пространства имен. С другой - partial классы нами создавались для дизайнера объектов чтобы действовать в разных модулях.