У меня есть часть программы на C #, загружающая функцию dll:
[DllImport("/Users/frk/Workspaces/MySharedLibrary.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto, EntryPoint = "MyCFunction")]
public static extern int MyFunction( [In][MarshalAs(UnmanagedType.I4)]MyFormat format, [In][MarshalAs(UnmanagedType.LPArray)] byte[] myString, [In][MarshalAs(UnmanagedType.I4)] int myStringLength, [MarshalAs(UnmanagedType.LPArray)] byte[] output, ref UIntPtr outputLength);
и вызывающая ее
int result = MyFunction(format, inPut, inputLength, outPut, ref outputLength);
на стороне C ++, у меня есть:
MyCPPFunction, которая отлично работает при вызове из исполняемого файла теста C.Эта функция MyCPPFunction содержит где-то глубоко в своих зависимостях глобальную переменную const, объявленную и инициализированную в анонимном пространстве имен:
namespace
{
constexpr unsigned RandTileSize = 256;
std::array<unsigned, RandTileSize * RandTileSize> GenerateSamples()
{
std::array<unsigned, RandTileSize * RandTileSize> samples;
std::mt19937 rd(0);
std::uniform_int_distribution<unsigned> distribution(0, 255);
for (unsigned i = 0; i < RandTileSize * RandTileSize; ++i)
{
samples[i] = distribution(rd);
}
return samples;
};
const auto samples = GenerateSamples();<-- Option#1 this causes a stack overflow when loading the dll in C# environment
unsigned Sample(unsigned index)
{
static const auto samples = GenerateSamples();<-- Option#2 this works and dll loads correctly
return samples[index];
}
}
Я запутался здесь, поскольку afaik, опция 1 должна выделять память в части кода dll,какая среда C # должна работать правильно?
Как у нас может быть опция # 1, чтобы не вызывать проблемы с выделением памяти при загрузке DLL?