wglCreateContext в сбое C#, но не в управляемом С++

Stoopid me!

Я думал, что файл post_build.bat отсутствовал, потому что, когда я создавал новый проект, он не появлялся в обозревателе решений в Visual Studio.

Однако ... он присутствовал в папке, содержащей новый проект.

Проблема заключалась в том, что я не создал запись в ItemGroup в файле ProjectTemplate.csproj.

Добавление

    <ItemGroup>
        <None Include="post_build.bat" />
    </ItemGroup>

решило проблему

5
задан SeeR 16 October 2008 в 05:12
поделиться

2 ответа

Найденное решение.
Проблема очень странная ужасный и действительно твердый найти. 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);

Оба пути решают проблему.

15
ответ дан 18 December 2019 в 12:03
поделиться

Я не могу протестировать это прямо сейчас, но мое первое подозрение было бы упаковкой структуры. Вы попытались установить упаковку на 1 в атрибуте StructLayout? Например:

[StructLayout(LayoutKind.Sequential, Pack=1)]

С наилучшими пожеланиями, Brian

0
ответ дан 18 December 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: