「トップページ/CSHARP/DLL」の編集履歴(バックアップ)一覧はこちら

トップページ/CSHARP/DLL」(2008/10/06 (月) 21:44:24) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

|&big(){DLLをいぢって見る}| #contents() ---- *DLLが見つからないとき  結局、マネージDLL不在チェックの方法がない(今のところ見つけられない)ので、アンマネージDLLだけをLoadLibraryで明示的リンクしてエラーチェックしても仕方がないような気がします。 (2008.09 マネージDLLの動的リンクを見つけました>[[こちら>トップページ/CSHARP/DLL2]]) **マネージアプリから、マネージDLLとアンマネージDLLを呼んでみる  マネージDLLは、プロジェクトプロパティで参照設定しておき、using namespace ...で呼べるようにしています。アンマネージDLLは、インポートライブラリを使用して、暗黙的リンクで使用しています。  マネージDLL(ManagedDLL.dll)が見つからないときは、以下のダイアログが出ます。なんのエラーが発生したのか不明な、意味のないダイアログです。 #ref(ManagedDLLNotFound.PNG)  アンマネージDLL(UnmanagedDLL.dll)が見つからないときは、以下のダイアログが出ます。しかも、古いウィンドウ形式のダイアログが(笑 #ref(UnmanagedDLLNotFound.PNG)  どちらも見つからないときは、アンマネージDLLのダイアログが出ます。 Test.cpp using namespace System; using namespace ManagedDLL; #include "UnmanagedDLL.h" int main(array<System::String ^> ^args) { Console::WriteLine("Manamged Add(1,2) = "+ManagedDLL::Lib::Add(1,2) ); Console::WriteLine("Unmanaged Sub(1,2) = "+ Sub(1,2) ); Console::ReadLine(); return 0; } ManagedDLL.h #pragma once namespace ManagedDLL { public ref class Lib { public: static int Add(int a, int b) { return a+b; } }; } ManagedDLL.cpp #include "ManagedDLL.h" #ifndef __UnmanagedDLL_h #define __UnmanagedDLL_h UnmanagedDLL.h #ifdef DLL_EXPORTS #define _EXPORT __declspec(dllexport) #else #define _EXPORT __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif _EXPORT int __stdcall Sub(int a, int b); #ifdef __cplusplus } #endif #endif // #ifndef __UnmanagedDLL_h UnmanagedDLL.cpp #include "windows.h" #define DLL_EXPORTS #include "UnmanagedDLL.h" BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } _EXPORT int __stdcall Sub(int a, int b) { return a - b; } ---- **マネージアプリからマネージDLL(内部でアンマネージDLL呼んでいる)を呼んでみる  マネージDLLは、プロジェクトプロパティで参照設定しておき、using namespace ...で呼べるようにしています。マネージDLLから呼んでいるアンマネージDLLは、インポートライブラリを使用して、暗黙的リンクで使用しています。  このパターンは、既存のライブラリをマネージコードで(特にC#/VBで)使用するための、もっとも多いパターンではないかと思われます。いまだにVC6のDLLしか用意されていないものも多数あり、それらを使用するためのラッパーとしての位置付けです。  マネージDLL(ManagedDLL.dll)が見つからないときは、以下のダイアログが出ます。なんのエラーが発生したのか不明な、意味のないダイアログです。アンマネージDLL(UnmanagedDLL.dll)が見つからないときも、同じダイアログが出ます。 #ref(ManagedDLLNotFound.PNG) Test.cpp using namespace System; using namespace ManagedDLL; int main(array<System::String ^> ^args) { Console::WriteLine("Manamged Add(3,1) = " + ManagedDLL::Lib::Add(3,1) ); Console::WriteLine("Manamged Sub(3,1) = " + ManagedDLL::Lib::Sub(3,1) ); Console::ReadLine(); return 0; } ManagedDLL.h #pragma once #include "UnmanagedDLL.h" namespace ManagedDLL { public ref class Lib { public: static int Add(int a, int b) { return a+b; } public: static int Sub(int a, int b) { return ::Sub(a,b); } }; } ManagedDLL.cpp #include "ManagedDLL.h" UnmanagedDLL.h #ifdef DLL_EXPORTS #define _EXPORT __declspec(dllexport) #else #define _EXPORT __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif _EXPORT int __stdcall Sub(int a, int b); #ifdef __cplusplus } #endif #endif // #ifndef __UnmanagedDLL_h UnmanagedDLL.cpp #include "windows.h" #define DLL_EXPORTS #include "UnmanagedDLL.h" BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } _EXPORT int __stdcall Sub(int a, int b) { return a - b; }
|&big(){DLLをいぢって見る}| #contents() -[[DLLの動的リンク>トップページ/CSHARP/DLL2]] ---- *DLLが見つからないとき  結局、マネージDLL不在チェックの方法がない(今のところ見つけられない)ので、アンマネージDLLだけをLoadLibraryで明示的リンクしてエラーチェックしても仕方がないような気がします。 (2008.09 マネージDLLの動的リンクを見つけました>[[こちら>トップページ/CSHARP/DLL2]]) **マネージアプリから、マネージDLLとアンマネージDLLを呼んでみる  マネージDLLは、プロジェクトプロパティで参照設定しておき、using namespace ...で呼べるようにしています。アンマネージDLLは、インポートライブラリを使用して、暗黙的リンクで使用しています。  マネージDLL(ManagedDLL.dll)が見つからないときは、以下のダイアログが出ます。なんのエラーが発生したのか不明な、意味のないダイアログです。 #ref(ManagedDLLNotFound.PNG)  アンマネージDLL(UnmanagedDLL.dll)が見つからないときは、以下のダイアログが出ます。しかも、古いウィンドウ形式のダイアログが(笑 #ref(UnmanagedDLLNotFound.PNG)  どちらも見つからないときは、アンマネージDLLのダイアログが出ます。 Test.cpp using namespace System; using namespace ManagedDLL; #include "UnmanagedDLL.h" int main(array<System::String ^> ^args) { Console::WriteLine("Manamged Add(1,2) = "+ManagedDLL::Lib::Add(1,2) ); Console::WriteLine("Unmanaged Sub(1,2) = "+ Sub(1,2) ); Console::ReadLine(); return 0; } ManagedDLL.h #pragma once namespace ManagedDLL { public ref class Lib { public: static int Add(int a, int b) { return a+b; } }; } ManagedDLL.cpp #include "ManagedDLL.h" #ifndef __UnmanagedDLL_h #define __UnmanagedDLL_h UnmanagedDLL.h #ifdef DLL_EXPORTS #define _EXPORT __declspec(dllexport) #else #define _EXPORT __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif _EXPORT int __stdcall Sub(int a, int b); #ifdef __cplusplus } #endif #endif // #ifndef __UnmanagedDLL_h UnmanagedDLL.cpp #include "windows.h" #define DLL_EXPORTS #include "UnmanagedDLL.h" BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } _EXPORT int __stdcall Sub(int a, int b) { return a - b; } ---- **マネージアプリからマネージDLL(内部でアンマネージDLL呼んでいる)を呼んでみる  マネージDLLは、プロジェクトプロパティで参照設定しておき、using namespace ...で呼べるようにしています。マネージDLLから呼んでいるアンマネージDLLは、インポートライブラリを使用して、暗黙的リンクで使用しています。  このパターンは、既存のライブラリをマネージコードで(特にC#/VBで)使用するための、もっとも多いパターンではないかと思われます。いまだにVC6のDLLしか用意されていないものも多数あり、それらを使用するためのラッパーとしての位置付けです。  マネージDLL(ManagedDLL.dll)が見つからないときは、以下のダイアログが出ます。なんのエラーが発生したのか不明な、意味のないダイアログです。アンマネージDLL(UnmanagedDLL.dll)が見つからないときも、同じダイアログが出ます。 #ref(ManagedDLLNotFound.PNG) Test.cpp using namespace System; using namespace ManagedDLL; int main(array<System::String ^> ^args) { Console::WriteLine("Manamged Add(3,1) = " + ManagedDLL::Lib::Add(3,1) ); Console::WriteLine("Manamged Sub(3,1) = " + ManagedDLL::Lib::Sub(3,1) ); Console::ReadLine(); return 0; } ManagedDLL.h #pragma once #include "UnmanagedDLL.h" namespace ManagedDLL { public ref class Lib { public: static int Add(int a, int b) { return a+b; } public: static int Sub(int a, int b) { return ::Sub(a,b); } }; } ManagedDLL.cpp #include "ManagedDLL.h" UnmanagedDLL.h #ifdef DLL_EXPORTS #define _EXPORT __declspec(dllexport) #else #define _EXPORT __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif _EXPORT int __stdcall Sub(int a, int b); #ifdef __cplusplus } #endif #endif // #ifndef __UnmanagedDLL_h UnmanagedDLL.cpp #include "windows.h" #define DLL_EXPORTS #include "UnmanagedDLL.h" BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } _EXPORT int __stdcall Sub(int a, int b) { return a - b; }

表示オプション

横に並べて表示:
変化行の前後のみ表示: