|
I want to call c++ function in C# script. So I put the c++ dll in Assert/Plugins. However, if this dll (call it MainDll) dynamically links to another dll (call it SecondaryDll, which is also put into the Plugins folder), I will always get a DllNotFoundException. I even write a VS C# project and calls MainDll linked with SecondaryDll in the same way as above, and everything is fine. Only not work in Unity C# script... EDITED: No, just the MainDll as posted: [DllImport("MainDll")] public static extern void FunctionMain1(); And in .cpp file which defines FunctionMain1, FunctionSec1 will be referenced, which I think is a purely c++ dynamic link: // MainDll.cpp include "SecondaryDll.h" extern "C" { DLL_EXPORT void FunctionMain1() { FunctionSec1(); } } Also, SecondaryDll may exports C++ class since it is intended to be referenced only by another c++ project rather than unity c# script, like: // MainDll.cpp include "SecondaryDll.h" CSecondaryDll gObj; extern "C" { DLL_EXPORT void FunctionMain1() { gObj.fun(); } }
(comments are locked)
|
|
A temporary solution could be to pre-merge your dll's using library tools and to put the merged dll into Unity. This way you only have one library and problem is gone... but yeah, it's quite an awful solution ! Actually, even for just one custom dll, it is not alone but depends on several windows system dlls. Unity can successfully load the first dll, which proves it can find the system dlls. Now the problem is unity did not know the path of secondary custom dlls, is it?
Nov 21 '11 at 02:24 PM
XiaoClouds
(comments are locked)
|
|
I never worked with more than one DLL in Unity, but I suspect that the problem is the SecondaryDll library location: since you've not declared it, Unity doesn't store this library wherever it's storing MainDll, and MainDll can't find it. You could try to declare any of the SecondaryDll functions in the same script you're declaring MainDll - I suppose Unity will store both in the same folder, allowing MainDll to find SecondaryDll. Another possibility would be to place SecondaryDll in the folder System32, the default DLL location - but this would complicate things when installing your game in another machine. aldonaletto, thanks for your suggestions. But I wonder it may be not so easy to declare SecondaryDll's functions, since it can be from 3rd part, only export c++ classes and have no source.
Nov 21 '11 at 07:15 AM
XiaoClouds
If you know at least one function declaration, you can declare it to test this. If not, try to store the DLL in the Windows/System32 folder - if this works, you will know that it's a location problem.
Nov 21 '11 at 12:51 PM
aldonaletto
You could of course also link the secondary Dll dynamically. Every 3rd party worth it's salt also delivers .lib files together with their .dlls
Nov 21 '11 at 01:21 PM
Tseng
aldonaletto, I've tried storing dll in System32, but this doesn't work. I also tried export a dummy method in SecondaryDll and declare it in C# script; but only when C# code has called this dummy method, then it can successfully load FunctionMain1() which relies on the SecondaryDll. As you said, this is truly a path-searching problem. I find this post in forum (http://forum.unity3d.com/threads/28069-Plugin-consisting-of-multiple-dll-s-(FMOD)) presents exactly the same issue, but also no better solution... The solution of dummy method has drawbacks, since the SecondaryDll may depends on the third dll or even more, so it is a nightmare if all needs a dummy method...
Nov 21 '11 at 01:31 PM
XiaoClouds
i hope this issue has been fixed ..if not in my case i just placed the secondary dlls in unity application's root directory and it worked fine..
Feb 01 '12 at 01:19 AM
abhinandan
(comments are locked)
|

Are you declaring both libraries and their functions? Like this:
[DllImport("MainDll")] public static extern void FunctionMain1(); [DllImport("MainDll")] public static extern void FunctionMain2(); ... [DllImport("SecondaryDll")] public static extern void FunctionSec1(); [DllImport("SecondaryDll")] public static extern void FunctionSec2(); ...As @SisterKy said in a comment, the Your answer box must be used only to answer the question - comments and replies must be posted using the add new comment button. I added the text to your question, and deleted the answer to make things clearer.