/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Pavel Savara
* - Initial implementation
*******************************************************************************/
package net.sf.robocode.dotnet.host;
import net.sf.robocode.core.*;
import net.sf.robocode.dotnet.repository.items.handlers.DotnetPropertiesHandler;
import net.sf.robocode.dotnet.repository.root.handlers.DllHandler;
import net.sf.robocode.manager.IVersionManagerBase;
import net.sf.robocode.io.Logger;
import net.sf.jni4net.Bridge;
import java.io.File;
import java.util.List;
/**
* @author Pavel Savara (original)
*/
public class Module extends BaseModule {
static {
// .NET proxies and their interfaces must be loaded in system class loader in order to call native methods
Init();
}
private static void Init() {
try {
String libsDir;
final String version = ContainerBase.getComponent(IVersionManagerBase.class).getVersionN();
final java.security.CodeSource source = Module.class.getProtectionDomain().getCodeSource();
final File file = new File(source.getLocation().toURI()).getCanonicalFile();
if (file.getName().equals("classes")) {
libsDir = file.getParent();
} else if (file.getName().endsWith(".jar")) {
libsDir = file.getParent();
} else {
throw new Error("Can't find " + file);
}
final String nhost = libsDir + "/robocode.dotnet.nhost-" + version + ".dll";
final String ncontrol = libsDir + "/robocode.control.dll";
Bridge.init(new File(libsDir));
// Bridge.setVerbose(true);
// Bridge.setDebug(true);
Bridge.SetSystemClassLoader(Container.engineLoader);
Bridge.LoadAndRegisterAssemblyFrom(new File(ncontrol));
Bridge.LoadAndRegisterAssemblyFrom(new File(nhost));
Container.cache.addComponent("DllItemHandler", DllHandler.class);
Container.cache.addComponent("CsPropertiesHandler", DotnetPropertiesHandler.class);
Container.cache.addComponent("VbPropertiesHandler", DotnetPropertiesHandler.class);
Container.cache.addComponent("DotnetPropertiesHandler", DotnetPropertiesHandler.class);
// .NET proxies
Container.cache.addComponent("robocode.host.cs", DotnetHost.class);
Container.cache.addComponent("robocode.host.vb", DotnetHost.class);
Container.cache.addComponent("robocode.host.dotnet", DotnetHost.class);
} catch (Throwable e) {
Logger.logError(e);
throw new Error("Can't initialize .NET Robocode", e);
}
}
public void afterLoaded(List<IModule> allModules) {
net.sf.robocode.dotnet.nhost.ModuleN.InitN();
}
}