Как только Вы встроили сторонний блок как ресурс, добавьте код для подписки на AppDomain.AssemblyResolve
событие текущего домена во время запуска приложения. Это событие стреляет каждый раз, когда подсистеме Fusion CLR не удается определить местоположение блока согласно зондированию (политики) в действительности. В конечном счете обработчик для AppDomain.AssemblyResolve
, загрузите ресурс с помощью Assembly.GetManifestResourceStream
и подайте его содержание как массив байтов в соответствие Assembly.Load
перегрузка. Ниже то, как одна такая реализация могла быть похожей в C#:
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var resName = args.Name + ".dll";
var thisAssembly = Assembly.GetExecutingAssembly();
using (var input = thisAssembly.GetManifestResourceStream(resName))
{
return input != null
? Assembly.Load(StreamToBytes(input))
: null;
}
};
, где StreamToBytes
мог быть определен как:
static byte[] StreamToBytes(Stream input)
{
var capacity = input.CanSeek ? (int) input.Length : 0;
using (var output = new MemoryStream(capacity))
{
int readLength;
var buffer = new byte[4096];
do
{
readLength = input.Read(buffer, 0, buffer.Length);
output.Write(buffer, 0, readLength);
}
while (readLength != 0);
return output.ToArray();
}
}
Наконец, поскольку некоторые уже упомянули, , ILMerge может быть другой опцией рассмотреть, хотя несколько более включенный.
Треугольник Паскаля - это, по сути, сумма двух значений, расположенных непосредственно над ним ....
1
1 1
1 2 1
1 3 3 1
и т. Д.
Для этих двух граничных условий мы кодируем в особых случаях (для инициализации ). Основная часть кода (рекурсивная часть) - это фактическая логика.
(Условие 'row == 1' не обязательно)
Треугольник Паскаля можно получить, добавив две записи над текущим.
| 0 1 2 3 column --+---------------------------------------------- 0 | 1 (case 1) 1 | 1 (case 2) 1 (case 2) 2 | 1 (case 3) 2 (sum) 1 (case 4) 3 | 1 (case 3) 3 (sum) 3 (sum) 1 (case 4) row
и т. Д., Например, столбец 2, строка 3 = столбец 2, строка 2 + столбец 1, строка 2, где представлены следующие случаи:
if (row_no == 0) // case 1
{
return 1;
}
else if (row_no == 1) // case 2
{
return 1;
}
else if (col_no == 0) // case 3
{
return 1;
}
else if (col_no == row_no) // case 4
{
return 1;
}
else // return the sum
return pascalRecursive(height-1,width)+pascalRecursive(height-1,width-1);
Вот как работает рекурсия
We call v(i, j), it calls v(i - 1, j), which calls v(i - 2, j) and so on,
until we reach the values that are already calculated (if you do caching),
or the i and j that are on the border of our triangle.
Then it goes back up eventually to v(i - 1, j), which now calls v(i - 2, j - 1),
which goes all the way to the bottom again, and so on.
....................................................................
_ _ _ _ call v(i, j) _ _ _ _ _
/ \
/ \
/ \
call v(i - 1, j) v(i - 1, j - 1)
/ \ / \
/ \ / \
call v(i - 2, j) v(i - 2, j - 1) v(i - 2, j - 1) v(i - 2, j - 2)
....................................................................
Если вам нужно часто получать значение и если у вас достаточно памяти:
class PascalTriangle
# unlimited size cache
public
def initialize
@triangle = Array.new
end
def value(i, j)
triangle_at(i, j)
end
private
def triangle_at(i, j)
if i < j
return nil
end
if @triangle[i].nil?
@triangle[i] = Array.new(i + 1)
else
return @triangle[i][j]
end
if (i == 0 || j == 0 || i == j)
@triangle[i][j] = 1
return @triangle[i][j]
end
@triangle[i][j] = triangle_at(i - 1, j) + triangle_at(i - 1, j - 1)
end
end