Проблем при зареждането на Unmanaged C++ DLL от WPF приложение

Преди всичко бих искал да благодаря на всеки, който чете това, за отделеното време! Аз съм доста добре информиран C# програмист с WinForms и давам шанс на WPF. Имах проблеми с извикването на функции от моето WPF приложение, така че реших да създам много лесен примерен проект, за да илюстрирам моя проблем. В това приложение създавам C++ Dll (с помощта на Visual Studio 2012 -> Visual C++ -> Win32 Console Application -> .DLL Project). В тази DLL аз просто създавам функция за връщане на DWORD. Моят DLL е показан по-долу:

// mydll.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
extern "C" __declspec(dllexport) DWORD __cdecl init();

DWORD __cdecl init()
{
    return 0x1234;
}

Сега също имам WPF приложение (използвайки VS 2012), в което просто се опитвам да извикам и отпечатам резултатите от функцията от гореспоменатата DLL. Моят WPF код създава бутон във формуляра. След като щракна върху бутона, извиквам моята DLL функция и отварям MessageBox, за да върна стойността от функцията, просто като това:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
namespace testdll
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        [DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern uint init();

        public unsafe MainWindow()
        {
            InitializeComponent();

        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            uint ret = init();
            MessageBox.Show("Return = " + ret.ToString());
        }
    }
}

В настройките на моя проект компилирам под „unsafe“, а също и за цели на x86 платформа. Мога да компилирам и двата проекта и настройвам изхода за изграждане на DLL проекта към съответните директории Release/Debug на моя WPF проект. Мога да натисна бутона „Старт“ в горната част в режим на отстраняване на грешки/освобождаване и WPF формулярът се отваря и показва бутона. Мога да щракна върху бутона и виждам правилния код за връщане от функцията на моя DLL, всичко работи ПЕРФЕКТНО. Въпреки това, когато копирам папката за освобождаване на която и да е друга машина, за да я стартирам там, моята WPF форма се отваря само при щракване върху бутона (и извикване на функцията на DLL), програмата ми се срива с:

"Необработено изключение при 0x7c812fd3 в testdll.exe: 0xE0434352: 0xe0434352."

Мога да създам подобен GUI в C# с помощта на Visual Studio 2005. Правя същото DLL извикване и използвам същия C# код и настройки. Нямам проблеми с отварянето на това приложение на други компютри и DLL функцията се извиква правилно без грешки. Това изглежда е проблем, който имам само с VS2012. Само да отбележа, че имам инсталиран пакет .NET Framework 4 и C++ 2012 Redistributable на компютъра, който се проваля. След търсене в интернет за подобни резултати и бъркане с много много настройки на проекта, все още съм объркан. Всяка помощ ще бъде високо оценена.


person ATSnipes    schedule 22.02.2013    source източник