System.EntryPointNotFoundException для режима RELEASE при вызове DLL на ассемблере в C# - PullRequest
0 голосов
/ 05 января 2020

Я пишу простое приложение, которое объединяет два соответствующих изображения в одно, чтобы создать анаглиф. Я использую VisualStudio2019 и C# для этого. Я написал основной алгоритм на ассемблере в dll для увеличения скорости.

У меня следующая проблема: В режиме отладки dll работает без проблем, и я получаю соответствующее результирующее изображение. Однако, когда я переключаюсь в режим выпуска, когда программа пытается войти в библиотеку, я получаю сообщение об ошибке: System.EntryPointNotFoundException: «невозможно найти точку входа с именем AnaglyphAlgorithmAsm в dll». Предвосхищая некоторые вопросы ... Да, в папку с исполняемым файлом (.exe) я положил dll, созданный из каталога выпуска. Файл .exe также находится в каталоге выпуска.

Это объявление метода:

        /// <summary>
        /// A function calling the dll algorithm written in assembler.
        /// </summary>
        /// <param name="leftImage"> Left image pixel array. </param>
        /// <param name="startStop"> The array has two values. Start - what index the algorithm should work from, End - which index the algorithm should work from. </param>
        /// <param name="filters"> An array that holds the filter for creating anaglyph. </param>
        /// <param name="rightImage"> Right image pixel array. </param>
[DllImport("DLL_ASM.dll", EntryPoint = "AnaglyphAlgorithmAsm")]
public static extern void AnaglyphAlgorithmAsm(float[] leftImage, int[] startStop, float[] filters, float[] rightImage);

Это вызов метода:

for (int i = 0; i < this.coords.Count; i += 2) // loop calling as many times as there are coordinates (start and end) for each thread
{
   int[] imageCoords = { this.coords[i] * 4, this.coords[i + 1] * 4 }; // get start and start index for the current thread
   var th = new Thread(() => // thread creation
           {
              AnaglyphAlgorithmAsm(leftImageInformation.imagePixelArray, imageCoords, anaglyphFilters, rightImageInformation.imagePixelArray);
           });
   this.threads.Add(th); // adding a newly created thread to the list of threads
}

Содержимое Файл LibAsm.def:

LIBRARY "DLL_ASM"
EXPORTS
AnaglyphAlgorithmAsm

Начало кода ассемблера:

; RCX - left image float pointer pixel array
; RDX - coords (start index and end index) int pointer
; R8 - filter anaglyph float pointer array
; R9 - right image float pointer pixel array

.DATA

maskLeft oword ?                                    ; mask for left image
maskRight oword ?                                   ; mask for right image

.CODE

AnaglyphAlgorithmAsm PROC

    mov         ebx, dword ptr[rdx]                 ; take start index from rdx
    mov         r11, rbx                            ; set it to r11
    mov         ebx, dword ptr[rdx + SIZEOF DWORD]  ; take end index from rdx
    mov         r10, rbx                            ; set it to r10
...

Основная программа, написанная на C#, и dll, написанная на ассемблере, установлены в режим release x64. Все отлично работает в режиме x64 debug.

...