Stoopid me!
Я думал, что файл post_build.bat отсутствовал, потому что, когда я создавал новый проект, он не появлялся в обозревателе решений в Visual Studio.
Однако ... он присутствовал в папке, содержащей новый проект.
Проблема заключалась в том, что я не создал запись в ItemGroup в файле ProjectTemplate.csproj.
Добавление
<ItemGroup>
<None Include="post_build.bat" />
</ItemGroup>
решило проблему
Найденное решение.
Проблема очень странная ужасный и действительно твердый найти. Somwhere в Интернете, я нашел, что при соединении opengl32.lib при компиляции приложения C++, он должен быть помещен прежде gdi32.lib. Причина этого состоит в том, что (предположительно), opengl32.dll перезаписывает функции ChoosePixelFormat и SetPixelFormat (и вероятно больше :-). Когда я нашел в своей версии C++, случайно она имела место.
Heh, но как сделать это в C#
После нескольких дней поиска я нашел, что в платформе дао они решили его с помощью kernel32.dll LoadLibrary () функция и загрузив opengl32.dll прежде, чем назвать SetPixelFormat
public static bool SetPixelFormat(IntPtr deviceContext, int pixelFormat, ref PIXELFORMATDESCRIPTOR pixelFormatDescriptor) {
Kernel.LoadLibrary("opengl32.dll");
return _SetPixelFormat(deviceContext, pixelFormat, ref pixelFormatDescriptor);
}
Таким образом, мы знаем, что opengl32.dll должен быть загружен перед gdi32.dll, есть ли любой другой способ сделать это. После, в то время как я думал, что мы можем вызвать немного только для указанных целей функция из opengl32.dll для загрузки его. Например:
[DllImport("opengl32.dll", EntryPoint = "glGetString", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
static extern IntPtr _glGetString(StringName name);
public static string glGetString(StringName name)
{
return Marshal.PtrToStringAnsi(_glGetString(name));
}
public enum StringName : uint
{
GL_VENDOR = 0x1F00,
GL_RENDERER = 0x1F01,
GL_VERSION = 0x1F02,
GL_EXTENSIONS = 0x1F03
}
и на запуске приложения, перед любым вызовом к gdi32.dll я использую это:
GL.glGetString(0);
Оба пути решают проблему.
Я не могу протестировать это прямо сейчас, но мое первое подозрение было бы упаковкой структуры. Вы попытались установить упаковку на 1 в атрибуте StructLayout? Например:
[StructLayout(LayoutKind.Sequential, Pack=1)]
С наилучшими пожеланиями, Brian