tôi đã xây dựng một C# DLL (MyTestDll) bằng cách sử dụng gói NuGet UnmanagedExports:tải C# DLL với kim ngạch xuất khẩu không được quản lý vào Python
[DllExport("Test", CallingConvention = CallingConvention.Cdecl)]
public static string Test(string name)
{
return "hi " + name + "!";
}
tôi sử dụng nó từ Python qua nhập khẩu ctypes DLL:
path = "C:\\Temp\\Test"
os.chdir(path)
dll = ctypes.WinDLL("MyTestDll.dll")
f = dll.Test
f.restype = ctypes.c_char_p
print f('qqq')
Nó chỉ là một tưởng tượng, nó hoạt động.
Sau đó, tôi đã thêm một DLL hơn (NoSenseDll):
namespace NoSenseDll
{
public class NoSenseClass
{
public static int Sum(int a, int b)
{
return a + b;
}
}
}
tôi bắt đầu sử dụng NoSenseDll này để thực hiện MyTestDll:
[DllExport("Test", CallingConvention = CallingConvention.Cdecl)]
public static string Test(string name)
{
return NoSenseDll.NoSenseClass.Sum(4, 5).ToString();
}
Thật không may, nó không hoạt động. Python nói:
WindowsError: [Error -532462766] Windows Error 0xE043435
Tôi đã cố thêm C:\\Temp\\Test
vào đường dẫn, nhưng điều đó không có tác dụng.
Tôi đã viết một bài kiểm tra ++ C:
#include "stdafx.h"
#include "windows.h"
#include <iostream>
#include <string>
#include "WinBase.h"
typedef char*(__stdcall *f_funci)(const char*);
int _tmain(int argc, _TCHAR* argv[])
{
int t;
std::string s = "C:\\Temp\\Test\\MyTestDll.dll";
HINSTANCE hGetProcIDDLL = LoadLibrary(std::wstring(s.begin(), s.end()).c_str());
f_funci funci = (f_funci)GetProcAddress(hGetProcIDDLL, "Test");
std::cout << "funci() returned " << funci(std::string("qqq").c_str()) << std::endl;
std::cin >> t;
return EXIT_SUCCESS;
}
Nó hoạt động nếu DLL thứ hai (NoSenseDll) là trong thư mục giống như ++ thực thi C. Nó không hoạt động nếu tôi chỉ thêm thư mục NoSenseDll vào PATH.
* Tôi đã cố gắng thêm 'C: \\ Temp \\ Test' vào đường dẫn, nhưng điều đó không có ích. * Bạn có thực sự sử dụng dấu gạch chéo ngược kép không? Có lẽ đó có thể là vấn đề. Chỉ cần đoán thôi. – Palec
Tôi đã cố gắng hết sức để chỉnh sửa Giải Đáp của bạn để dễ hiểu hơn, và tôi đã sửa NoSen * c * eDll thành NoSen * s * eDll. Cảm ơn những nỗ lực bạn đưa vào phần Hỏi & đáp này! – Palec