Я пишу простое приложение, которое объединяет два соответствующих изображения в одно, чтобы создать анаглиф. Я использую 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
.